C - 释放结构

use*_*099 47 c malloc struct

假设我有这个结构

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,callocrealloc.

在你的情况下,你只有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泄露的第一,那么就会出现内存这是分配的内存firstnamesuName指针.

  • 不..我说如果`free(ptrobj)`完成了,那么`firstname`和`suname`指针是堆上的成员,它已经消失了,所以`firstname`和`suname`分配的内存不会被释放因为要释放它,你必须写 `free(firstname)` 但 firstname 不再存在 ..hopw 你明白了 (2认同)

小智 10

free还不够,free只需将内存标记为未使用,结构数据将一直在那里,直到被覆盖。为了安全起见,请将指针设置为NULLafter free

前任:

if (testPerson) {
    free(testPerson);
    testPerson = NULL;
}
Run Code Online (Sandbox Code Playgroud)

struct类似于数组,它是一块内存。您可以通过结构成员的偏移量来访问它。第一个结构体的成员放置在 offset 处0,因此第一个结构体成员的地址与结构体的地址相同。


dmc*_*kee 5

因为你定义了structchar数组组成,所以这两个字符串结构并释放struct就足够了,也没有办法释放struct但保留数组.对于这种情况,你会想要做这样的事情struct { char *firstName, *lastName; },但你需要为名称单独分配内存和处理时释放的问题内存.

旁白:你有没有理由struct被释放后保留这些名字?


Vis*_*esn 5

首先,您应该知道,在以下情况下定义和分配内存时分配了多少内存。

   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);