重新分配后如何更改保存的地址
How to change saved address after reallocation
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]"
指向?
Is there a way to automatic adapt the address "coords[0]" points to?
没有
见How to update other pointers when realloc moves the memory block?
没有完全 "automatic" 的方法来做到这一点,但在需要重新分配的情况下,您经常会看到 "offset pointers." 的使用,所以不要这样:
coords[0] = &foo[0];
您可以将 coords
的类型更改为类似 ptrdiff_t[]
的类型,然后执行以下操作:
coords[0] = &foo[0] - foo;
这样,您保存的不是实际指针,而是分配开始处的偏移量。而且这个值永远不需要改变。
Is there a way to automatic adapt the address "coords[0]" points to?
没有。 C 不会跟踪您存储地址的位置。如果你需要这个,你的工作就是跟踪。
另一个想法是跳出框框思考:
- 您能否以一种不需要存储多个指向动态数组开头的指针的方式重组数据?
- 你能改用偏移量吗?
只需将 coords
设为 size_t []
(这是正确的类型)并将索引存储到 foo
而不是绝对地址。
或者,在 realloc
个 foo
之后,您可以循环更新所有 coords
个条目。
但第一个版本可能不会比使用地址慢很多,在复杂化之前先进行基准测试。
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]"
指向?
Is there a way to automatic adapt the address "coords[0]" points to?
没有
见How to update other pointers when realloc moves the memory block?
没有完全 "automatic" 的方法来做到这一点,但在需要重新分配的情况下,您经常会看到 "offset pointers." 的使用,所以不要这样:
coords[0] = &foo[0];
您可以将 coords
的类型更改为类似 ptrdiff_t[]
的类型,然后执行以下操作:
coords[0] = &foo[0] - foo;
这样,您保存的不是实际指针,而是分配开始处的偏移量。而且这个值永远不需要改变。
Is there a way to automatic adapt the address "coords[0]" points to?
没有。 C 不会跟踪您存储地址的位置。如果你需要这个,你的工作就是跟踪。
另一个想法是跳出框框思考:
- 您能否以一种不需要存储多个指向动态数组开头的指针的方式重组数据?
- 你能改用偏移量吗?
只需将 coords
设为 size_t []
(这是正确的类型)并将索引存储到 foo
而不是绝对地址。
或者,在 realloc
个 foo
之后,您可以循环更新所有 coords
个条目。
但第一个版本可能不会比使用地址慢很多,在复杂化之前先进行基准测试。