【发布时间】:2021-05-02 08:54:56
【问题描述】:
几个小时以来,我一直试图找出问题所在,但无法解决。这是代码,当然要长得多,但我已将其简化为问题本身。
#define BUFFER_SIZE 60
char *str;
void readText() {
char read_char;
int i = 0;
str = (char *) calloc(BUFFER_SIZE, sizeof(char));
while ((read_char = getchar()) != EOF) { /* user hits ctrl+d */
*(str+i) = read_char;
i++;
if (i % BUFFER_SIZE == 0) {
str = (char *) realloc(str, BUFFER_SIZE * sizeof(char));
}
}
textSize = i;
/* Here I print the text... same error printing or not printing */
free(str);
}
}
只有当输入文本超出缓冲区大小时才会出现错误。
(编辑: if (i % BUFFER_SIZE == 0) 所以它每次达到60,但错误是一样的 )
谢谢
【问题讨论】:
-
缓冲区溢出导致未定义行为。不要让它发生。
-
顺便说一下,
getchar函数返回一个int,这对于与int值EOF进行比较非常重要。 -
另一方面,对于任何指针或数组
p和索引i,表达式*(p + i)完全等于p[i]。后者 (p[i]) 通常更容易阅读和理解,而且写起来更少。 -
查看 realloc 与原始
calloc。 at all 分配的内存量有 any 差异吗?不。然后您立即离开缓冲区以调用 UB。同样糟糕的是,即使您在那里修复了大小,您也需要更新动态 容量,而不是固定的常量缓冲区大小。