c-在以前malloc处理过的指针上使用realloc会导致分段错误



我对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

[…]否则,如果参数与内存管理先前返回的指针不匹配函数,或者如果对freerealloc的调用已解除分配空间行为未定义。

TL;DR首先检查realloc()是否成功,如果成功,不要触摸text,如果realloc()失败,则需要调用free(text);

您不应该释放指针text,因为一旦成功,realloc()就会释放旧指针。

来自C11标准第7.22.3.5章realloc函数:

realloc函数释放ptr指向的旧对象,并返回指向具有由大小指定的大小的新对象的指针。新的内容对象应与解除分配前的旧对象相同,以较小者为准新的和旧的尺寸。新对象中超出旧对象大小的任何字节都具有不确定值。

相关内容

  • 没有找到相关文章

最新更新