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

C 如何在动态分配的内存中移动参数?,c,pointers,memory-management,realloc,C,Pointers,Memory Management,Realloc,我很难理解如何使用内存指针。我有两个指针(名称、地址、optionInfo)指向以前分配的内存。这些字符串的大小可能会有所不同。它们存储在myMemory中,如下所示: ------------------------------------------------------------------- | int ID 4Bytes | name 6bytes | adress 8Bytes| optionalInfo 8Bytes| -----------------------------

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

-------------------------------------------------------------------
| int ID 4Bytes | name 6bytes | adress 8Bytes| optionalInfo 8Bytes|
-------------------------------------------------------------------
假设我需要增加或减少名称的大小并对其进行更改。如何正确使用realloc以不丢失任何我想要的信息?如何将内存中的参数转换为新名称的可用空间?我需要用最少的内存

这是我的结构,禁止更改

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

编辑:myMemory的大小是已知的。这个结构中的名称、地址和OptualIn信息是指向MyStime

< P>中存储字符串的指针。让我们考虑这个内存布局方面的问题……/P> 。。。忽略它与
struct myStruct
成员的关系,而不是
myMemory

假设我需要增加或减少名称的大小 改变它。如何正确使用realloc以避免任何松动 我想要什么信息

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

如何将内存中的参数转换为free 新名字的空间

该作业最明显的工具是
memmove()
函数。因此,假设您希望将标记为“name”的区域的大小从6字节增加到(比如)10字节,而不覆盖任何其他数据,您首先需要重新分配:

void *temp = realloc(x.myMemory, old_size + 4);
由于不能保证
realloc()
会成功,因此在您确认
x.myMemory
指针成功之前,不得更新该指针:

if (temp) {  // if temp is non-null
然后,您可以在较大的空间内移动地址和optionalInfo数据,以便为更多姓名信息腾出空间:

    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;
}

void*tmp=realloc(myMemory,currentsize*2*sizeof*myMemory);如果(!tmp){/*句柄错误*/}myMemory=tmp;currentsize*=2
(这将使
myMemory
指针的数量增加一倍)我不确定我是否遵守了。您似乎在询问
struct myStruct
myMemory
成员指向的数据,但您是根据
struct myStruct
的其他成员使用的相同标识符来描述它的。其他成员是否与您试图执行的任务有关?我认为可能是
名称
等成员指向
myMemory
指向的空间,但在这种情况下,它们的类型有点令人惊讶,似乎与给出的具体示例布局不一致。这种结构似乎相互矛盾。与其说一个结构包含N个事物的数据,不如让N个结构分别代表一个事物。换句话说,
char*name
等等,然后有一个
myStruct
数组。如果有人强迫你使用这种结构,他们就是在强迫你做一个不可靠的设计。
myMemory
的大小无关紧要。您可以
malloc
任意大小。尽管如此,这种奇异形式的
sizeof(myStruct)
是固定的。这不会改变的。分配的子元素的大小是任意的,必须在
malloc()
calloc()
调用中指定。
    x.myMemory = temp;
}