假设我有这个 struct

typedef struct person{
    char firstName[100], surName[51]
} PERSON;

我通过malloc分配空间,并用一些值填充它

PERSON *testPerson = (PERSON*) malloc(sizeof(PERSON));
strcpy(testPerson->firstName, "Jack");
strcpy(testPerson->surName, "Daniels");

释放该 struct 占用的所有内存的正确且安全的方法是什么?是"免费(测试人员);"够了,还是需要逐个释放每个 struct 的属性?

这就引出了另一个问题-- struct 是如何存储在内存中的?我注意到一个奇怪的行为-当我试图打印 struct 地址时,它等于第一个属性的地址.

printf("Structure address %d == firstName address %d", testPerson, testPerson->firstName);

Which means that this free(testPerson) should be equal to this free(testPerson->firstName);

这不是我想做的.

谢谢

推荐答案

答案很简单:free(testPerson)就够了.

请记住,仅当您使用malloccallocrealloc分配内存时,才能使用free().

在你的情况下,你只有testPerson个malloced内存,所以释放就足够了.

如果您使用了char * firstname , *last surName,那么在这种情况下,存储名称必须分配内存,这就是为什么您必须单独释放每个成员.

这里还有一点应该是相反的顺序;这意味着,分配给元素的内存将在稍后完成,因此首先释放指向对象的指针.

释放每个元素,您可以看到如下演示:

typedef struct Person
{
char * firstname , *last surName;
}Person;
Person *ptrobj =malloc(sizeof(Person)); // memory allocation for struct
ptrobj->firstname = 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,那么就会有内存泄漏,这是firstnamesuName指针分配的内存.

C++相关问答推荐

C限制限定符是否可以通过指针传递?

标准的C17标准是用括号将参数包装在函数声明中吗

在C中使用JMP_buf数组进行线程化(在xv6中测试)

为什么GDB/MI进程的FIFO循环中有read()阻塞

用gcc-msse 2编译的C程序包含AVX 1指令

如何在C中只对字符串(包含数字、单词等)中的数字进行重复操作?

在libwget中启用Cookie会导致分段故障

如何在C-函数中混合使用C代码和ASM?

不确定如何处理此编译错误

在下面的C程序中,.Ap0是如何解释的?

使用mmap为N整数分配内存

Linux Posix消息队列

浮点正零何时不全为零?

在C中使用字符串时是否不需要内存分配?

为什么 int32_t 和 int16_t 在 printf 输出中具有相同的位数?

如何使用 VLA 语法使用 const 指针声明函数

C 语言中霍尔分区的快速排序算法

无法在线程内用 C 打印?

在 C/C++ 中原子按位与字节的最佳方法?

如何让 unlinkat(dir_fd, ".", AT_REMOVEDIR) 工作?