gpt4 book ai didi

c - 如何在动态分配的内存中移动参数?

转载 作者:行者123 更新时间:2023-11-30 16:18:58 25 4
gpt4 key购买 nike

我很难理解如何使用内存指针。我有两个指针(名称、地址、可选信息)指向先前分配的 myMemory。这些字符串的大小可能会有所不同。它们像这样存储在 myMemory 中:

-------------------------------------------------------------------
| int ID 4Bytes | name 6bytes | adress 8Bytes| optionalInfo 8Bytes|
-------------------------------------------------------------------

假设我需要增加或减少名称的大小并更改它。如何正确使用 realloc 才不会丢失我想要的任何信息?如何将内存中的参数转移为新名称的可用空间?我需要使用最少的内存。

这是我的结构,禁止更改。

struct myStruct{
char* name;
char* adress;
char* optionalInfo;
void* myMemory;
};

编辑:myMemory 的大小已知。该结构中的名称、地址和可选信息是指向存储在 myMemory 中的字符串的指针

最佳答案

让我们根据内存布局来考虑这个问题......

-------------------------------------------------------------------
| int ID 4Bytes | name 6bytes | adress 8Bytes| optionalInfo 8Bytes|
-------------------------------------------------------------------

...忽略它与 struct myStruct 成员的关系除了 myMemory .

Lets say I need to increase or decrease the size of the name and change it. How can I correctly use realloc to not loose any information I want?

只要你realloc大小至少与已占用的数据一样大,重新分配不会丢失任何数据。也不会相对于 block 的起始地址移动任何内容。但请注意,重新分配的 block 可能位于与原始 block 不同的位置,如果是,则原始 block 将被释放,并且不能再被访问。

How can I shift my arguments in memory to free space for a new name?

最适合这项工作的工具是 memmove()功能。因此,假设您想要将标记为“name”的区域的大小从 6 个字节增加到 10 个字节,而不覆盖任何其他数据,您首先需要重新分配:

void *temp = realloc(x.myMemory, old_size + 4);

realloc()不保证成功,您不得更新x.myMemory指针直到您知道它确实成功了:

if (temp) {  // if temp is non-null

然后,您可以在更大的空间内移动地址和可选信息数据,为更多名称信息腾出空间:

    memmove(((char *)temp) + new_offset_of_address_data,
((char *)temp) + old_offset_of_address_data,
combined_size_of_address_and_optionalInfo_data);

强制转换为类型 char *需要,因为指针算术是根据指向类型的单位定义的,因此对于指向 void 的指针根本没有定义。 .

不要忘记将新指针分配给您的结构:

    x.myMemory = temp;
}

关于c - 如何在动态分配的内存中移动参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55753601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com