【发布时间】:2021-02-12 23:45:28
【问题描述】:
在运行我的代码时(如第一个代码块所示),我收到此错误:
*** Error in `./a.out': free(): invalid pointer: 0x0000000001e4c016 ***
我找到了一个修复程序(显示在第二个代码块中),但我不明白为什么会首先发生错误。
我阅读了有关 strtok_r 的文档,但我不明白为什么将“str”分配给新的 char* 可以解决问题。
“rest = str”不是表示 rest 和 str 指向同一个内存块。这如何解决问题???
破码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char* str = (char*) malloc(sizeof(char) * 128);
char* token;
printf("Enter something: ");
fgets(str, 128, stdin);
while ((token = strtok_r(str, " ", &str))) {
printf("%s\n", token);
}
free(str);
return (0);
}
固定代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char* str = (char*) malloc(sizeof(char) * 128);
char* token;
char* rest = str;
printf("Enter something: ");
fgets(str, 128, stdin);
while ((token = strtok_r(rest, " ", &rest))) {
printf("%s\n", token);
}
free(str);
return (0);
}
【问题讨论】:
-
NEVER NEVER NEVER NEVER NEVER!!!!! 转换从
malloc()返回的值。只需#include <stdlib.h>并让编译器检查结果。如果你添加一个演员,你告诉编译器你知道你在做什么,而你不知道。
标签: c dynamic-memory-allocation free c-strings strtok