我有一个名为** lines的指针数组,每行长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作为加法的最终结果在函数的末尾不起作用。

最佳答案

您在这里错了:


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


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

希望这可以帮助

关于c - 为什么realloc创建两个不同的指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41151149/

10-14 03:30