为什么realloc会创建两个不同的指针?

时间:2016-12-14 19:57:52

标签: c memory memory-management realloc

我有一个名为**行的指针数组,每行的长度为100个字符。

并且有一个函数可以为任何给定的行添加字符,如果它不够大则重新分配该行:

void add_letter(char *line, int pos, char letter) {
    if(strlen(line) % 100 == 0){
        line = realloc(line, sizeof(char) * strlen(line) + 100);
    }
    ...

add_letter被称为:

add_letter(lines[0], pos, ch);
此处的

行等于lines[0],在第二行中,gdb为1返回p line == lines[0]。 此处linelines[0]都位于内存位置0x6465e0

但在realloc来电之后,line变为0x648200,但lines[0]保持不变,并成为""空字符串。

是什么导致realloc这样做?由于这个原因,添加的最终结果strcat(line, newline)newline在函数结束时不起作用。

1 个答案:

答案 0 :(得分:3)

你错了:

  

此处linelines[0]都位于内存位置0x6465e0。

这两个变量都有 0x6465e0,但它们位于不同的位置。 当您使用realloc调用line时,运行时会释放line指向的内存(0x6465e0),分配新内存并将其地址放在line中 - 那是0x648200lines[0]不受此操作的影响,但已指向的内存已被释放。 底线 - 如果您重新分配,则需要使用新位置更新指向旧位置的所有指针

希望这有帮助