我有一个名为** 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]
。这里
line
和lines[0]
都在内存位置0x6465e0
中。但是在
realloc
调用之后,line
变为0x648200
,但是lines[0]
保持不变并成为""
空字符串。是什么导致
realloc
如此行事?由于这个原因,strcat(line, newline)
,newline
作为加法的最终结果在函数的末尾不起作用。 最佳答案
您在这里错了:
此处line
和lines[0]
都位于内存位置0x6465e0中。
这两个变量的值均为0x6465e0
,但它们位于不同的位置。
当您使用realloc
调用line
时,运行时将释放line
指向的内存(即0x6465e0
),分配新的内存并将其地址放入line
-即0x648200
。 lines[0]
的值不受此操作的影响,但是它所指向的内存已经被释放。
底线-如果重新分配,则需要用新位置更新所有指向旧位置的指针
希望这可以帮助
关于c - 为什么realloc创建两个不同的指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41151149/