为什么 realloc 创建两个不同的指针?
Why does realloc create two different pointers?
我有一个名为 **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 returns 1
for p line == lines[0]
。
这里 line
和 lines[0]
都在内存位置 0x6465e0
.
但是在realloc
调用之后,line
变成了0x648200
,但是lines[0]
保持不变,变成了一个""
空字符串。
是什么原因导致 realloc
出现这种情况?由于这个原因,strcat(line, newline)
、newline
作为加法的最终结果在函数末尾不起作用。
你错了:
Here line
and lines[0]
are both in memory location 0x6465e0.
两个变量都有值0x6465e0
,但它们位于不同的位置。
当您使用 line
调用 realloc
时,运行时会释放 line
指向的内存(即 0x6465e0
),分配新内存并将其地址放入 line
-即 0x648200
。 Value of lines[0]
不受此操作影响,但它指向的内存已被释放。
底线——如果你重新分配,你需要用新位置
更新指向旧位置的所有指针
希望对您有所帮助
我有一个名为 **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 returns 1
for p line == lines[0]
。
这里 line
和 lines[0]
都在内存位置 0x6465e0
.
但是在realloc
调用之后,line
变成了0x648200
,但是lines[0]
保持不变,变成了一个""
空字符串。
是什么原因导致 realloc
出现这种情况?由于这个原因,strcat(line, newline)
、newline
作为加法的最终结果在函数末尾不起作用。
你错了:
Here
line
andlines[0]
are both in memory location 0x6465e0.
两个变量都有值0x6465e0
,但它们位于不同的位置。
当您使用 line
调用 realloc
时,运行时会释放 line
指向的内存(即 0x6465e0
),分配新内存并将其地址放入 line
-即 0x648200
。 Value of lines[0]
不受此操作影响,但它指向的内存已被释放。
底线——如果你重新分配,你需要用新位置
希望对您有所帮助