【发布时间】:2016-08-08 14:41:10
【问题描述】:
我在for 循环中有一个while 循环来处理字符串。这里基本上是我的代码结构:
char myString[1000];
//Initialize and maybe change myString
for(/*conditions*/){
while(/*conditions*/){
if(strchr(myString,' ') == NULL){
break;
}
char *temp = malloc(sizeof(char) * strlen(myString));
strcpy(temp,myString);
*strchr(temp,' ') = '\0';
strcat(myString," ");
strcat(myString,temp);
free(temp);
}
}
有时,这段代码工作得很好,但有时进程结束并返回 3,这意味着有一个错误(3 是我通常在我不应该喜欢的地方尝试使用 NULL 时得到的返回值myPointer->example 其中myPointer 为NULL)。经过一些测试,我发现导致问题的行是free(temp);。我试图用if(temp != NULL){free(temp);} 替换它,但它没有改变任何东西。我试图用char temp[1000] 而不是malloc 声明temp 并删除free(temp); 行,但它仍然做同样的事情。如果我拿走free(temp); 行并仍然使用malloc,问题就解决了,但是存在巨大的内存泄漏,所以我不能这样做。是否有错误取决于myString字符串中的内容,这意味着如果其中有某个值,则总是有错误,如果有另一个特定值,则永远不会有错误,但我无法找出哪些类型的值有效,哪些无效,这似乎是随机的。
为什么free(temp); 有时有效,有时无效,我怎样才能让它始终有效?
【问题讨论】:
-
char *temp = malloc(sizeof(char) * strlen(myString)); strcpy(temp,myString);越界写入,未定义行为。此外,如果strchr()返回NULL,则NULL-dereference 的未定义行为。 -
另外,
sizeof( char )根据定义是一个,因此它作为传递给malloc()的参数的一部分是多余的。 -
我投票结束这个问题,因为这个问题是由一个简单的错字引起的。