【发布时间】:2020-01-18 20:40:42
【问题描述】:
我有以下用 C 编写的程序:
...
char *answer = NULL;
char *pch = strtok(phrase, " "); // phrase is a string with possibly many words
while (pch) {
char *tmp = translate_word(pch); // returns a string based on pch
void *ptr = realloc(answer, sizeof(answer) + sizeof(tmp) + 1000); // allocate space to answer
if (!ptr) // If realloc fails
return -1;
strcat(answer, tmp); // append tmp to answer
pch = strtok(NULL, " "); // find next word
}
...
问题在于 strtok() 表现出奇怪的行为,它返回一个在 phrase 字符串中不存在但属于 answer 字符串的单词。
另一方面,当我更改以下行时:
void *ptr = realloc(answer, sizeof(answer) + sizeof(tmp) + 1000);
到:
void *ptr = realloc(answer, sizeof(answer) + sizeof(tmp) + 1);
strok() 按预期工作。
在这种情况下,realloc() 如何影响 strtok()?他们甚至不使用相同的变量。期待您的见解。
【问题讨论】:
-
sizeof(answer)和sizeof(tmp)- 这不是你想的那样。此外,realloc不会根据strcat工作的需要终止answer。 -
reallocfreesanswer重新分配后,所以你应该使用strcat(ptr, tmp)。 -
关于:
realloc()sizeof(tmp):tmp调用中的表达式是一个指针,因此取决于您的底层硬件和某些编译器选项,该值将是 4 或 8 个字节,不是tmp指向的字符数组的长度 -
关于:
void *ptr = realloc(answer, sizeof(answer) + sizeof(tmp) + 1000); // allocate space to answer if (!ptr) // If realloc fails return -1;1)当realloc()失败时,ptr原来指向的数据丢失,导致内存泄漏。始终从realloc()的返回值中分配一个临时指针,检查临时指针是否不为 NULL,然后分配给原始指针。 (续) -
(cont) 另外,不要在发生错误时立即退出,而是首先调用
perror( "realloc failed" );,它会输出到stderr,您的错误消息和系统认为发生错误的文本原因。