比方说,我有这样的结构
typedef struct person{
char firstName[100], surName[51]
} PERSON;
而我通过的malloc分配空间,并与一些价值观加油吧
PERSON *testPerson = (PERSON*) malloc(sizeof(PERSON));
strcpy(testPerson->firstName, "Jack");
strcpy(testPerson->surName, "Daniels");
什么是释放由该结构所采取的一切记忆的正确和安全的方式? 是 “免费(testPerson);” 足够或做我需要释放每个结构的属性逐一?
这使我另一个问题 - 如何存储在内存中的结构? 我注意到一个奇怪的现象 - 当我尝试打印结构地址是等于它的第一属性的地址。
printf("Structure address %d == firstName address %d", testPerson, testPerson->firstName);
这意味着该无(testPerson)应等于这种免费(testPerson->的firstName);
而这不是我想做的事情。
谢谢
Answer 1:
答案很简单: free(testPerson)
就足够了。
记住你可以用free()
只有当您使用分配的内存malloc
, calloc
或realloc
。
在你的情况,你只malloc内存为testPerson
因此释放足以。
如果您使用char * firstname , *last surName
然后在这种情况下存储姓名必须已分配的内存,这就是为什么你必须单独释放每个成员。
这里还应该以相反的顺序的点; 这意味着,分配给元素存储完成之后,从而free()
它首先然后释放指针对象。
释放每一个元素,你可以看到如下所示的演示:
typedef struct Person
{
char * firstname , *last surName;
}Person;
Person *ptrobj =malloc(sizeof(Person)); // memory allocation for struct
ptrobj->fistname = malloc(n); // memory allocation for firstname
ptrobj->surName = malloc(m); // memory allocation for surName
.
. // do whatever you want
free(ptrobj->surName);
free(ptrobj->firstname);
free(ptrobj);
这背后的原因是,如果你释放ptrobj
第一,那么就会出现内存泄漏是由分配的内存firstname
和suName
指针。
Answer 2:
因为你所定义的struct
是由char
数组,两个字符串的结构和释放的struct
是足够的,也没有一个释放的方式struct
,但保持数组。 对于这种情况,你会想要做类似struct { char *firstName, *lastName; }
struct { char *firstName, *lastName; }
,但你需要为名称单独分配内存和处理的何时释放内存的问题。
旁白:有没有你想保留的名字后一个原因, struct
已被释放?
Answer 3:
首先,你应该知道,当你定义了多少内存分配,并在以下情况下分配内存。
typedef struct person{
char firstName[100], surName[51]
} PERSON;
PERSON *testPerson = (PERSON*) malloc(sizeof(PERSON));
1)的sizeof(人)现在返回151个字节(不包括填充物)
2)的151个字节的存储器堆被分配。
3)自由,调用free(testPerson)。
但如果你宣布你的结构
typedef struct person{
char *firstName, *surName;
} PERSON;
PERSON *testPerson = (PERSON*) malloc(sizeof(PERSON));
然后
1)的sizeof(人)现在返回8个字节(不包括填充物)
2)需要通过调用的malloc()或释放calloc()来分配用于firstName和姓存储。 喜欢
testPerson->firstName = (char *)malloc(100);
3)以释放,第一释放构件在结构中比游离的结构体。 即,自由(testPerson->的firstName); 自由(testPerson->姓氏); 自由(testPerson);
Answer 4:
这样,你只需要释放的结构,因为这些场与将被分配为结构的一部分静态大小的阵列。 这也是该地址你看比赛的原因:阵列处于该结构的第一件事。 如果声明的字段为char *您必须手动malloc和free他们。
Answer 5:
Mallocs和释放需要进行配对。
抓住的malloc的内存人足够大的一大块。
当你释放你告诉malloc的开始“这里的”一块内存不再需要,它知道多少分配和释放它。
无论你打电话
free(testPerson)
要么
free(testPerson->firstName)
所有的free()的实际接收到的是一个地址,同一个地址,它不能告诉你叫。 您的代码更清晰,如果您使用免费(testPerson)虽然 - 它清楚地匹配了使用malloc。
Answer 6:
你不能自由类型不动态分配。 虽然阵列是语法上类似( int* x = malloc(sizeof(int) * 4)
可以在相同的方式使用int x[4]
是),呼叫free(firstName)
可能会导致后者的错误。
例如,利用这个代码:
int x;
free(&x);
free()
是一个函数,它接受在一个指针。 &x
是一个指针。 这段代码可以编译,即使它是行不通的。
如果我们假装所有内存被以同样的方式分配, x
被“分配”的定义中,“解放”在第二条线,再范围结束后,“解放”了。 你不能释放同一个资源的两倍; 它会给你一个错误。
这甚至不是提的事实,出于某些原因,你可能无法提供免费存储x
不关闭程序。
TL;博士:刚刚释放struct
,你会没事的。 不要在阵列拨打免费; 只有调用它动态分配的内存。
Answer 7:
free
是不够的, free
只是标志着内存为未使用,该结构数据将在那里,直到覆盖。 为了安全起见,将指针NULL
后free
。
例如:
if (testPerson) {
free(testPerson);
testPerson = NULL;
}
struct
是像一个数组类似,它是一个内存块。 您可以访问通过其偏移结构成员。 所述第一结构的构件被放置在偏移0
,从而第一结构的成员的地址是相同结构的地址。
文章来源: C - freeing structs