在先前使用malloc-ed的指针上使用realloc会导致分段错误

时间:2016-05-05 20:22:58

标签: c pointers malloc dynamic-memory-allocation realloc

我有问题,这个代码抛出堆栈转储。我不知道什么是错的。

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;
}

2 个答案:

答案 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

  

[...]否则,如果   该参数与先前由内存管理返回的指针不匹配   函数,或者如果通过调用freerealloc释放了空格,则   行为未定义。

TL; DR 首先检查realloc()是否成功,如果成功,请不要触摸text,如果realloc()失败,那么您需要致电free(text);

答案 1 :(得分:0)

你不应该释放指针text,因为成功realloc()会释放旧指针。

从C11标准章节7.22.3.5重新分配功能:

  

realloc函数释放ptr指向的旧对象并返回一个   指向具有size指定大小的新对象的指针。新内容   在解除分配之前,对象应与旧对象的对象相同,直到较小的对象   新旧尺寸。新对象中超出旧对象大小的任何字节都有   不确定的价值观。