我有问题,这个代码抛出堆栈转储。我不知道什么是错的。
char *text;
text = (char *) malloc(sizeof (char));
int size = 1;
char c = 'a';
char *new;
while (1) {
c = getchar();
putchar(c);
if (c == 10) {
text[size - 1] = '\0';
break;
}
text[size - 1] = c;
size++;
new = (char *) realloc(text, size * sizeof (*new));
free(text);
text = new;
}
答案 0 :(得分:1)
在您的代码中,您将text
作为第一个参数传递给realloc()
,稍后,在不检查失败的情况下,将其传递给free()
。这就是造成这个问题的原因。
根据C11
,章节§7.22.3.5
realloc
函数释放ptr
指向的旧对象并返回一个 指向具有size指定大小的新对象的指针。 [...]如果新对象的内存不能 已分配,旧对象未被释放,其值不变。
所以,如果realloc()
成功,那么,调用
free(text);
调用undefined behavior。您无需再费心text
,请取消对free()
的调用。
相关,free()
,§7.22.3.3
[...]否则,如果 该参数与先前由内存管理返回的指针不匹配 函数,或者如果通过调用
free
或realloc
释放了空格,则 行为未定义。
TL; DR 首先检查realloc()
是否成功,如果成功,请不要触摸text
,如果realloc()
失败,那么您需要致电free(text);
答案 1 :(得分:0)
你不应该释放指针text
,因为成功realloc()
会释放旧指针。
从C11标准章节7.22.3.5重新分配功能:
realloc函数释放ptr指向的旧对象并返回一个 指向具有size指定大小的新对象的指针。新内容 在解除分配之前,对象应与旧对象的对象相同,直到较小的对象 新旧尺寸。新对象中超出旧对象大小的任何字节都有 不确定的价值观。