如下代码在windows下vs2005和dev-c++都通过,但在linux下报错,错误是
错误如下:
*** glibc detected *** malloc():
invalid next size
*** glibc detected *** free():
我在网上搜了下,是指针问题。
代码如下:
void InitOnePch(char **ppchPre,char **ppch,char **ppchGet)
{
while(**ppch != '-' && **ppch != '!')
{
if(**ppch == '^')
**ppch = ' ';
(*ppch)++;
}
memset(*ppchGet,'\0',20);
strncpy(*ppchGet,*ppchPre,*ppch-*ppchPre);
(*ppch)++;
(*ppchPre) = (*ppch);
}
void InitStaff(Staff *pst,char *pchPre,char *pch,char *pchGet)
{
InitOnePch(&pchPre,&pch,&pchGet);
strcpy(pst->szGivenName,pchGet);
InitOnePch(&pchPre,&pch,&pchGet);
strcpy(pst->szSurname,pchGet);
InitOnePch(&pchPre,&pch,&pchGet);
strcpy(pst->szRoomNum,pchGet);
InitOnePch(&pchPre,&pch,&pchGet);
strcpy(pst->szPhoneNum,pchGet);
InitOnePch(&pchPre,&pch,&pchGet);
pst->staff_title = (Title)atoi(pchGet);
InitOnePch(&pchPre,&pch,&pchGet);
strcpy(pst->szPosition,pchGet);
InitOnePch(&pchPre,&pch,&pchGet);
strcpy(pst->szDepartment,pchGet);
InitOnePch(&pchPre,&pch,&pchGet);
strcpy(pst->szUsername,pchGet);
}
void Test(char *pchSrc)
{
char *pchPre = pchSrc;
char *pch = pchSrc;
char *pchGet = new char[20];
Staff st;
while(*pch != '\0')
{
if(*pch == ',' || *pch == '!')
{
memset(pchGet,'\0',20);
strncpy(pchGet,pchPre,pch-pchPre);
pch++;
pchPre = pch;
if(!strcmp(pchGet,"a"))
{
InitStaff(&st,pchPre,pch,pchGet);
AddOneStaff(&st);
}
else if(!strcmp(pchGet,"ga"))
{
ListAll();
std::cout<<"--------"<<std::endl;
}
else if(!strcmp(pchGet,"gb"))
{
char szDepartment[20];
InitOnePch(&pchPre,&pch,&pchGet);
strcpy(szDepartment,pchGet);
std::cout<<"Department: "<<szDepartment<<std::endl;
ListDepartment(szDepartment);
}
else if(!strcmp(pchGet,"pa"))
{
char szPhoneNum[5];
InitOnePch(&pchPre,&pch,&pchGet);
strcpy(szPhoneNum,pchGet);
std::cout<<"Phone number: "<<szPhoneNum<<std::endl;
PrintByPhoneNum(szPhoneNum);
}
else if(!strcmp(pchGet,"pb"))
{
char szUsername[20];
InitOnePch(&pchPre,&pch,&pchGet);
strcpy(szUsername,pchGet);
std::cout<<"Username: "<<szUsername<<std::endl;
PrintByUsername(szUsername);
}
else if(!strcmp(pchGet,"ma"))
{
char *pchPhoneNum = new char[5];
pchPhoneNum[4] = '\0';
InitStaff(&st,pchPre,pch,pchGet);
strcpy(pchPhoneNum,st.szPhoneNum);
ModifyByPhoneNum(st,pchPhoneNum);
delete [] pchPhoneNum;
}
else if(!strcmp(pchGet,"mb"))
{
char *pchUsername = new char[20];
pchUsername[19] = '\0';
InitStaff(&st,pchPre,pch,pchGet);
strcpy(pchUsername,st.szUsername);
ModifyByUsername(st,pchUsername);
delete [] pchUsername;
}
else if(!strcmp(pchGet,"da"))
{
std::cout<<"Please input PhoneNum that you want to delete"<<std::endl;
char szPhoneNum[5];
InitOnePch(&pchPre,&pch,&pchGet);
strcpy(szPhoneNum,pchGet);
DeleteByPhoneNum(szPhoneNum);
}
else if(!strcmp(pchGet,"db"))
{
std::cout<<"Please input Username that you want to delete"<<std::endl;
char szUsername[20];
InitOnePch(&pchPre,&pch,&pchGet);
strcpy(szUsername,pchGet);
DeleteByUsername(szUsername);
}
else if(!strcmp(pchGet,"sa"))
{
std::cout<<"Please input Surname"<<std::endl;
char szSurname[20];
InitOnePch(&pchPre,&pch,&pchGet);
strcpy(szSurname,pchGet);
SearchBySurname(szSurname);
}
else if(!strcmp(pchGet,"sb"))
{
std::cout<<"Please input Surname (Soundex)"<<std::endl;
char szSurnameSoundex[20];
InitOnePch(&pchPre,&pch,&pchGet);
strcpy(szSurnameSoundex,pchGet);
SearchBySurnameSoundex(szSurnameSoundex);
}
else if(!strcmp(pchGet,"is"))
{
std::cout<<"Please input index"<<std::endl;
int iSelectedIndex;
InitOnePch(&pchPre,&pch,&pchGet);
iSelectedIndex = atoi(pchGet);
DisplayByIndex(iSelectedIndex);
}
else if(!strcmp(pchGet,"q"))
break;
else if(!strcmp(pchGet,"Q"))
break;
else
ShowMainMenu();
}
pch++;
}
}