我搜索了一个答案,但没有设法找到答案。
我有一个动态分配的结构,这意味着将分配结构本身及其一些成员。像:
typedef struct dataUse
{
char *num;
char *name;
char *position;
char *eMail;
float upload;
float download;
} DataUse;
DataUse *ptr = NULL;
现在,我有为*ptr
以及*name
,*position
,*eMail
重新分配内存的功能。 name
,position
和eMail
的大小当然不尽相同。
现在我明白了,重新分配某些内容将保留数据的原始地址并增加内存大小,或者如果它不能分配到同一空间,它将复制其内容并为指针分配一个新地址。
现在在我的情况下,如果我重新分配我的struct
(*ptr
)并希望增加其大小而后者发生,这意味着我的结构内容将被复制并且新地址将被签署,什么会发生在*name
,*position
和*email
吗?我还可以通过ptr->num
访问它们和旧内容吗?我会有某种记忆丧失吗?
我希望有人能够验证会发生什么并解释,如果我重新整理整个结构,它将如何在内存中查找。我已经看过,结构在内存中的样子我已经阅读了很多帖子,但有时候在添加更多指针并进入更深层次后会有点混乱(例如使用双指针)。 / p>
如果我用双指针执行它会发生什么 - **ptr2
来保存指向结构的指针,然后重新分配**ptr2
来保存更多的指针?
答案 0 :(得分:1)
如果我正确理解了您的问题,您已分配DataUse
的实例,并将地址存储在ptr
中。现在你要重新分配它。
指针存储绝对地址,因此重新分配包含指针的结构不会丢失数据。
因此DataUse
的实例位于内存中的某个位置,其地址存储在ptr
中。 num
的数据位于其他位置,其地址存储在num
的{{1}}字段中。将DataUse
的实例复制到另一个地方时,DataUse
字段也会被复制,因此字符串num和name等的地址保持不变,仍然在num
的新副本中, num
字段。
您只需重新分配结构,即存储地址的位置已更改,但name
,num
,......中保存的地址保持不变。
答案 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
如果以前没有使用过,必须为零。