【问题标题】:Relocating intermediate pointers during realloc在重新分配期间重定位中间指针
【发布时间】: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


【解决方案1】:

你必须在重新分配内存后重新分配指针q

p = realloc(p,12*sizeof(int));
q = p + 3;

*q = 5;

请注意在调用函数 realloc 时应该使用中间指针,因为通常它可以返回 NULL。在这种情况下,会出现内存泄漏。

例如

int *tmp = realloc(p,12*sizeof(int));

if ( tmp != NULL ) 
{
    p = tmp;
    q = p + 3;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    相关资源
    最近更新 更多