假设我有这个结构
typedef struct person{
char firstName[100], surName[51]
} PERSON;
Run Code Online (Sandbox Code Playgroud)
我正在通过malloc分配空间并用一些值填充它
PERSON *testPerson = (PERSON*) malloc(sizeof(PERSON));
strcpy(testPerson->firstName, "Jack");
strcpy(testPerson->surName, "Daniels");
Run Code Online (Sandbox Code Playgroud)
释放该结构所占用的所有内存的正确和安全的方法是什么?是"免费的(testPerson);" 够了还是我需要逐个释放每个结构的属性?
它引出了另一个问题 - 结构如何存储在内存中?我注意到一种奇怪的行为 - 当我尝试打印结构地址时,它等于它的第一个属性的地址.
printf("Structure address %d == firstName address %d", testPerson, testPerson->firstName);
Run Code Online (Sandbox Code Playgroud)
这意味着这个free(testPerson)应该等于这个free(testPerson-> firstName);
那不是我想做的.
谢谢
Omk*_*ant 62
简单的回答:free(testPerson)就够了.
记住,你可以使用free(),只有当你使用分配的内存malloc,calloc或realloc.
在你的情况下,你只有malloced内存,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);
Run Code Online (Sandbox Code Playgroud)
这背后的原因是,如果你释放ptrobj泄露的第一,那么就会出现内存这是分配的内存firstname和suName指针.
小智 10
free还不够,free只需将内存标记为未使用,结构数据将一直在那里,直到被覆盖。为了安全起见,请将指针设置为NULLafter free。
前任:
if (testPerson) {
free(testPerson);
testPerson = NULL;
}
Run Code Online (Sandbox Code Playgroud)
struct类似于数组,它是一块内存。您可以通过结构成员的偏移量来访问它。第一个结构体的成员放置在 offset 处0,因此第一个结构体成员的地址与结构体的地址相同。
因为你定义了struct由char数组组成,所以这两个字符串是结构并释放struct就足够了,也没有办法释放struct但保留数组.对于这种情况,你会想要做这样的事情struct { char *firstName, *lastName; },但你需要为名称单独分配内存和处理时释放的问题是内存.
旁白:你有没有理由在struct被释放后保留这些名字?
首先,您应该知道,在以下情况下定义和分配内存时分配了多少内存。
typedef struct person{
char firstName[100], surName[51]
} PERSON;
PERSON *testPerson = (PERSON*) malloc(sizeof(PERSON));
Run Code Online (Sandbox Code Playgroud)
1)sizeof(PERSON)现在返回151个字节(不包括填充)
2)151个字节的内存在堆中分配。
3)要免费,请致电free(testPerson)。
但是如果您声明结构为
typedef struct person{
char *firstName, *surName;
} PERSON;
PERSON *testPerson = (PERSON*) malloc(sizeof(PERSON));
Run Code Online (Sandbox Code Playgroud)
然后
1)sizeof(PERSON)现在返回8个字节(不包括填充)
2)需要通过调用malloc()或calloc()为firstName和surName分配内存。喜欢
testPerson->firstName = (char *)malloc(100);
Run Code Online (Sandbox Code Playgroud)
3)要释放,首先要释放结构中的成员,而不要释放结构。即free(testPerson-> firstName); 免费(testPerson-> surName); 免费(testPerson);
| 归档时间: |
|
| 查看次数: |
81484 次 |
| 最近记录: |