我正在尝试编译和在Linux下用C编写的代码,并收到此错误消息:
glibc检测到malloc():内存损坏
我无法找出原因......
substring()只是通过给出起始索引和长度来返回原始字符串的一部分。例如substring(“this is example”,0,4)=“this”;
char *substring(char* str, int start, int length) {
char *newString = (char *)malloc(length * sizeof(char));
int i, x = 0;
int end=start+length-1;
for(i = start ; i <= end; i++){
newString[x++] = str[i];
}
newString[x] = '\0';
return newString;
}
和getCharIndexFirst()只返回指定char的第一次出现的索引 getCharIndexLast()只返回指定char的最后一次出现的索引
及以下是主要功能:
//consoleCommand has the form of 'send MESSAGE ID', has the value from stdin
int firstSpace = getCharIndexFirst(consoleCommand,' ');
int lastSpace = getCharIndexLast(consoleCommand,' ');
int len = strlen(consoleCommand);
char *header = substring(consoleCommand,0,firstSpace);
printf("header is: %s\n",header);
char *cmd = substring(consoleCommand,firstSpace+1,lastSpace-firstSpace-1);
printf("command is: %s\n",cmd); // the code only runs up to here and output the error..
char *socketstr = substring(consoleCommand,lastSpace+1,len-lastSpace-1);
printf("socket is: %s\n",socketstr);
以下是更多信息:consoleCommand通常是stdin,具有'发送MESSAGE ID'的形式,当MESSAGE为12个字符长时发生错误... 例如'发送此消息4','此消息'是cmd并且长度为12个字符,这给了我错误! 它适用于任何其他长度,我尝试过3,4,24 ......
任何提示都会受到赞赏,谢谢!
答案 0 :(得分:12)
newString[x] = '\0';
此时x
等于length
,这意味着你在你分配的内存末尾写了1个字符。你需要为另外一个角色分配空间。
答案 1 :(得分:5)
您没有为终止'\0'
字符分配任何空间,因此您会溢出分配以写入此字符。您还需要在分配中计算此字符:
char *newString = (char *)malloc((length + 1) * sizeof(char));