重新分配动态分配的结构

时间:2016-03-20 13:13:46

标签: c

我搜索了一个答案,但没有设法找到答案。

我有一个动态分配的结构,这意味着将分配结构本身及其一些成员。像:

typedef struct dataUse
{
    char *num;
    char *name;
    char *position;
    char *eMail;
    float upload;
    float download;
} DataUse;

DataUse *ptr = NULL;

现在,我有为*ptr以及*name*position*eMail重新分配内存的功能。 namepositioneMail的大小当然不尽相同。

现在我明白了,重新分配某些内容将保留数据的原始地址并增加内存大小,或者如果它不能分配到同一空间,它将复制其内容并为指针分配一个新地址。

现在在我的情况下,如果我重新分配我的struct*ptr)并希望增加其大小而后者发生,这意味着我的结构内容将被复制并且新地址将被签署,什么会发生在*name*position*email吗?我还可以通过ptr->num访问它们和旧内容吗?我会有某种记忆丧失吗?

我希望有人能够验证会发生什么并解释,如果我重新整理整个结构,它将如何在内存中查找。我已经看过,结构在内存中的样子我已经阅读了很多帖子,但有时候在添加更多指针并进入更深层次后会有点混乱(例如使用双指针)。 / p>

如果我用双指针执行它会发生什么 - **ptr2来保存指向结构的指针,然后重新分配**ptr2来保存更多的指针?

3 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,您已分配DataUse的实例,并将地址存储在ptr中。现在你要重新分配它。

指针存储绝对地址,因此重新分配包含指针的结构不会丢失数据。

因此DataUse的实例位于内存中的某个位置,其地址存储在ptr中。 num的数据位于其他位置,其地址存储在num的{​​{1}}字段中。将DataUse的实例复制到另一个地方时,DataUse字段也会被复制,因此字符串num和name等的地址保持不变,仍然在num的新副本中, num字段。

您只需重新分配结构,即存储地址的位置已更改,但namenum,......中保存的地址保持不变。

答案 1 :(得分:0)

如果我们假设ptr[i]有效(例如,先前使用i+1分配了至少DataUse malloc()的数组),以及ptr的内存大小{使用realloc()会增加{1}}点数,如果ptr[i].num发生更改,则ptr的地址会发生变化,但ptr[i].num的值不会更改。

答案 2 :(得分:0)

请考虑以下代码段:

DataUse *ptr= malloc(sizeof(DataUse));    // allocate non-zeroed memory

以上为您的结构分配内存。请注意,它不会归零,因此任何应归零的东西都必须归零。

ptr->name= malloc(strlen(this_name)+1);
strcpy(ptr->name, this_name);

以上内容初始化name

free(ptr_name);
ptr->name= malloc(strlen(new_name)+1);
strcpy(ptr->name, new_name);

上面在name中添加了一个新名称。它首先释放分配的内存。

char *tmpname= realloc(ptr->name, strlen(new_name)+1);
if (tmpname) {
    ptr->name= tmpname;
    strcpy(ptr->name, new_name);
}
else printf("Out of memory);

以上(约)相同,但使用realloc。请注意,ptr->name如果以前没有使用过,必须为零。