【发布时间】:2020-04-16 18:32:50
【问题描述】:
假设如果我有一个分配的内存块和一个中间 指针指向已分配块中的某个位置。如果我改变 通过使用
realloc()来确定内存的大小,这可能会重新定位 具有新大小的整个块。有什么办法可以 也重新定位旧指针?
示例代码:
int main()
{
int *p = malloc(10*sizeof(int));
int *q;
q = p + 3;
*q = 4;
p = realloc(p,12*sizeof(int));
*q = 5; //BOOM
}
有没有什么方法可以通过自动重新分配中间指针q来避免LINE 8引起的分段错误?
【问题讨论】:
-
记住块开头到指向地址的偏移量,然后重新计算
realloc之后的指针。 -
而您对
q的计算完全错误:编译器将添加“3 个整数”,所以不要执行“3*sizeof(int)”,因为那将是 12 个整数(32 位整数)。 -
谢谢@PaulOgilvie。但是有没有什么库方法可以记住偏移量然后改变它?
-
应该通过使用整数偏移量而不是多个指针来避免这个问题
-
@PaulOgilvie 我建议将其修复为
q = p + 3;,因为该错误会分散真正问题的注意力
标签: c pointers memory-leaks realloc dangling-pointer