我在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,' ') = ' ';
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);
有时工作,有时不,我怎么能让它总是工作?
主要问题是,您分配的元素比所需的内存少一个。
strlen()
没有考虑到终止null,因此您缺少所需的内存。之后,做
strcpy(temp,myString);
实际上是超出边界的访问(存储终止的null),会调用未定义的行为。因此,您可以看到
要解决这个问题,您应该修改分配语句,如有时,这段代码工作得很好,但有时进程结束并返回3,这意味着有一个错误[....]
char *temp = malloc(strlen(myString) + 1); // +1 for terminating null,
// sizeof(char) == 1, guaranteed by C standard.
strchr()
和strrchr()
函数返回一个指向匹配字符的指针,如果没有找到该字符则返回NULL。[…]
*strchr(temp,' ') = ' ';
NULL
),再次调用UB。在解引用返回的指针