当我无法弄清楚我的代码的问题。该程序的目标是从文本文件中读取单词并将其添加到链接列表中。当我运行时:
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个单词时崩溃了,但我不知道为什么。
答案 0 :(得分:0)
前138个单词被读取并释放没有问题。
不是真的。即使在第一次make_string()
电话中也存在问题。
代码正在尝试复制字符串,但却有一个错误。
static char *make_string(char buffer[], int length) {
char *str = (char *)(malloc(length+1)); // size good
memcpy(str, buffer, length); // copy OK
str[length + 1] = '\0'; // null character assigned in wrong place, 1 too far out
return str;
}
在错误的位置分配数据(指定越界@EOF)并且没有使用空字符定义str[length]
的值(以及稍后使用它)会导致未定义的行为
Here是strdup()
函数,但我建议您在审核之前尝试对make_string()
进行代码修复。
以下代码不限制写入buf[]
while(character != EOF && isalnum(character) != 0){
if (index + 1 >= MAXBUF) {
puts("Too long");
return NULL; // or some other error handling
}
buf[index] = character;