2016-03-20 41 views
-1

我搜索了一个答案,但没有设法找到一个。重新分配动态分配的结构

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

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

DataUse *ptr = NULL; 

现在我拥有的功能重新分配内存*ptr,也为​​,*position*eMailname,positioneMail的大小当然有所不同。

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

现在在我的情况下,如果我重新分配我的struct*ptr),并希望增加其大小,后者开始,这意味着我的结构内容将被复制,新的地址将签署,将会发生什么​​,*position*email?我仍然可以通过ptr->num访问它们和旧内容。我会有什么样的记忆力减退?

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

然后会发生什么,如果我用双指针来做 - **ptr2来保持指向结构的指针,然后realloc **ptr2来保存更多的指针?

+1

什么? '如果我重新分配我的结构' - 你的结构是固定大小的! –

+0

任何时候当你发现自己在问“它在内存中的效果如何”的时候,可以考虑在你的平台上启动一个调试器,并在其中执行一个调试器,并且实际上*这样做*:I.e. *看着记忆*。实际上“看起来”的方式比其他任何地方都更好。 – WhozCraig

+0

@Martin James-我的结构不固定。我有一个函数,它会将内存添加到我的结构体ex:'void allocStruct(DataUse ** ptr){在此分配内存}'。 – Name

回答

1

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

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

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

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

+0

“,但是...的地址......”,“地址*在......中保存”更准确。 *只要您更改包含它们的结构的地址,这些成员的地址就会改变。 – WhozCraig

+0

@songziming是的。我想分配* ptr来存储更多的结构。所以,如果我理解正确,如果我的结构将被复制和添加内存,我可以访问以前存储的结构,它的成员通过* ptr? – Name

0

如果我们假设ptr[i]是有效的(例如至少i+1DataUse阵列先前已经使用malloc()分配),并且ptr点增加时,存储器的使用realloc()尺寸,然后的ptr[i].num该地址将改变,如果ptr已更改,但ptr[i].num的值不会。

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,则必须为零。