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]"
点?
答案 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
条目。
但是第一个版本的速度并不比使用地址慢得多,你可以在复杂之前进行基准测试。