重新分配后如何更改保存的地址

时间:2015-12-14 14:18:05

标签: c pointers memory malloc realloc

struct AD_SINT32Type* = NULL;
foo = (struct mystructArray*)malloc(sizeof(struct mystructArray));
foo[0].x = 45;
foo[0].y = 90;
coords[0] = &foo[0];


foo = (struct mystructArray*)realloc(foo, 2 * sizeof(struct mystructArray));
foo[1].x = 30;
foo[1].y = 15;
coords[1] = &foo[1];

此代码"coords[1]"按预期指向,但"coords[0]"指向重新分配之前的旧地址。有没有办法自动调整地址"coords[0]"点?

4 个答案:

答案 0 :(得分:3)

没有完全"自动"这样做的方法,但在需要重新分配的情况下,你经常会看到使用"偏移指针。"所以不要这样:

coords[0] = &foo[0];

您可以将coords的类型更改为ptrdiff_t[],并执行此操作:

coords[0] = &foo[0] - foo;

这样,您不会保存实际指针,而是保存从分配开始的偏移量。而这个价值永远不需要改变。

答案 1 :(得分:1)

  

有没有办法自动调整地址" coords [0]"指向?

没有

请参阅How to update other pointers when realloc moves the memory block?

答案 2 :(得分:0)

  

有没有办法自动调整地址" coords [0]"指向?

没有。 C不会跟踪存储地址的位置。如果您需要这个,那么您的工作就是跟踪。

另一个想法是跳出框框思考:

  • 你能否以一种不需要存储多个指向动态数组开头的指针来重组数据?
  • 你可以使用补偿吗?

答案 3 :(得分:0)

只需将coords设为size_t [](这是正确的类型),并将索引存储到foo而不是绝对地址。

或者,在realloc foo之后,您可以更新循环中的所有coords条目。

但是第一个版本的速度并不比使用地址慢得多,你可以在复杂之前进行基准测试。