我对C有问题,这段代码抛出堆栈转储。我不知道怎么了。
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] = ' ';
break;
}
text[size - 1] = c;
size++;
new = (char *) realloc(text, size * sizeof (*new));
free(text);
text = new;
}
在您的代码中,将text
作为第一个参数传递给realloc()
,然后,在不检查失败的情况下,将其传递给free()
。这就是造成这个问题的原因。
根据C11
,第7.22.3.5章
realloc
函数解除分配ptr
指向的旧对象,并返回指向具有由大小指定的大小的新对象的指针。[…]如果新对象的内存不能分配时,旧对象不会被解除分配,其值也不会改变。
因此,如果realloc()
成功,之后调用
free(text);
调用未定义的行为。您不必再为text
而烦恼,请删除对free()
的调用。
相关,针对free()
,§7.22.3.3
[…]否则,如果参数与内存管理先前返回的指针不匹配函数,或者如果对
free
或realloc
的调用已解除分配空间行为未定义。
TL;DR首先检查realloc()
是否成功,如果成功,不要触摸text
,如果realloc()
失败,则需要调用free(text);
您不应该释放指针text
,因为一旦成功,realloc()
就会释放旧指针。
来自C11标准第7.22.3.5章realloc函数:
realloc函数释放ptr指向的旧对象,并返回指向具有由大小指定的大小的新对象的指针。新的内容对象应与解除分配前的旧对象相同,以较小者为准新的和旧的尺寸。新对象中超出旧对象大小的任何字节都具有不确定值。