我有一个名为**行的指针数组,每行的长度为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
在函数结束时不起作用。
答案 0 :(得分:3)
你错了:
此处
line
和lines[0]
都位于内存位置0x6465e0。
这两个变量都有值 0x6465e0
,但它们位于不同的位置。
当您使用realloc
调用line
时,运行时会释放line
指向的内存(0x6465e0
),分配新内存并将其地址放在line
中 - 那是0x648200
。 lines[0]
的值不受此操作的影响,但已指向的内存已被释放。
底线 - 如果您重新分配,则需要使用新位置更新指向旧位置的所有指针
希望这有帮助