我在while循环中有一个for循环来处理字符串.这基本上是我的代码的结构:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
有时,这段代码运行得很好,但有时候进程结束并返回3,这意味着有一个错误(3是我尝试使用NULL时通常会得到的返回值,我不应该喜欢,例如myPointer->examplewhere myPointerNULL ).经过一些测试,我发现引起问题的那条线是free(temp);.我试图替换它,if(temp != NULL){free(temp);}但它没有改变任何东西.我试图temp用char temp[1000]而不是malloc拿走free(temp);线来宣布,但它仍然做同样的事情.如果我拿走free(temp);线路仍然使用malloc问题解决了,但是存在巨大的内存泄漏,所以我不能这样做.如果有错误取决于myString字符串中的内容,这意味着如果那里有某个值,则总会出现错误,如果有另一个特定值,则永远不会出现错误,但我可以我们设法找出哪种类型的价值观有效,哪些价值观无效,似乎是随机的.
为什么free(temp);有时候工作,有时候不工作,怎样才能让它始终有效?
主要问题是,你分配的一个元素少于所需的内存.
strlen()不考虑终止空值,所以你只需要一个所需的内存.做完了
strcpy(temp,myString);
Run Code Online (Sandbox Code Playgroud)
实际上是超出绑定访问(存储终止null),它调用未定义的行为.结果,你可以看到
有时,这段代码工作正常,但有时进程结束并返回3,这意味着有错误[....]
要解决,您应该修改分配语句,如
char *temp = malloc(strlen(myString) + 1); // +1 for terminating null,
// sizeof(char) == 1, guaranteed by C standard.
Run Code Online (Sandbox Code Playgroud)
也就是说,来自手册页
在strchr()和strrchr()函数返回一个指向匹配的字符,如果没有找到字符或NULL.[...]
并且,对于突出显示的场景,
*strchr(temp,' ') = '\0';
尝试取消引用无效的空指针constant(NULL),并再次调用UB.在取消引用返回的指针之前检查有效的返回值
| 归档时间: |
|
| 查看次数: |
213 次 |
| 最近记录: |