【发布时间】:2017-03-20 20:28:27
【问题描述】:
当我无法弄清楚我的代码的问题时。该程序的目标是从文本文件中读取单词并将它们添加到链接列表中。当我运行它时:
static char *make_string(char buffer[], int length) {
char *str = (char *)(malloc(length+1));
memcpy(str, buffer, length);
str[length + 1] = '\0';
return str;
}
char *words_next_word() {
char buf[MAXBUF] = {0};
int character = getchar();
int index = 0;
static int count = 0;
printf("it is the %d word \n", count);
count++;
while(isalnum(character) == 0){
character = getchar();
}
while(character != EOF && isalnum(character) != 0){
buf[index] = character;
index++;
character = getchar();
}
return make_string(buf, index);
}
从文本文件中获取单词后,我将其添加到链表中。添加单词后,我释放字符串。前 138 个单词被毫无问题地读取和释放。由于某种原因,程序在尝试读取第 138 个单词时崩溃,但我不知道为什么。
【问题讨论】:
-
提示:
str[length]在return str;之前的值是多少? -
str[length + 1] = '\0';越界写入,未定义行为。 -
这段代码是否适用于前 137 个单词而不适用于第 138 个单词?
-
@BobFlanders 未定义行为不需要保持一致。它是未定义。
-
@EOF 感谢您的解释,我不知道未定义的行为是不一致的(尽管我应该想到)。
标签: c pointers memory-management crash