释放结构成员指向的内存
Posted
技术标签:
【中文标题】释放结构成员指向的内存【英文标题】:Freeing memory pointed by members of a struct 【发布时间】:2021-06-23 02:25:50 【问题描述】:在我的应用程序中实现之前,我正在使用动态分配的结构数组和该结构的成员进行测试,但我对这些并不熟悉(因此进行了测试),并且在释放成员时遇到了错误每个结构。
我没有正确释放吗?还是我分配内存时的问题?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define CODE_LEN 20
#define QTY_LEN 5
typedef struct
char* code;
char* qty;
int filePos;
ENTRY;
void malloc_ptr(ENTRY**);
void realloc_ptr(ENTRY**);
int main()
ENTRY *ssar;
int i;
malloc_ptr(&ssar);
memcpy(ssar[0].code, "abcde", 5);
memset(ssar[0].code + 5, 0, 1);
printf("%s\n", ssar[0].code);
realloc_ptr(&ssar);
memcpy(ssar[4].code, "fghij", 5);
memset(ssar[4].code + 5, 0, 1);
printf("%s\n", ssar[4].code);
//Exited with code=3221226356 here
for(i = 0;i < 5;i ++)
free(ssar[i].code);
free(ssar[i].qty);
free(ssar);
return 0;
void realloc_ptr(ENTRY** ssar)
int i;
*ssar = realloc(*ssar, 5 * sizeof(*ssar));
for(i = 1;i < 5;i ++)
(*ssar)[i].code = malloc(CODE_LEN * sizeof(char));
(*ssar)[i].qty = malloc(QTY_LEN * sizeof(char));
void malloc_ptr(ENTRY** ssar)
*ssar = malloc(sizeof(*ssar));
(*ssar)[0].code = malloc(CODE_LEN * sizeof(char));
(*ssar)[0].qty = malloc(QTY_LEN * sizeof(char));
谢谢
【问题讨论】:
仅供参考,您不应该考虑释放结构的成员或释放指针。你正在释放他们指向的内存。 你说得对,这只是语言的误用,但我想这样思考和表达会更清楚 您已经设法通过编写不必要的复杂代码来迷惑自己。首先编写一个函数,例如ENTRY* ENTRY_alloc (void);
,然后删除所有指向指针的指针。一旦你完成了这项工作,你就可以开始使用指针到指针来学习了。
您不释放指针,也不释放成员。你只释放它们指向的东西。
您只需要一个包装器。 realloc(NULL, s)
与 malloc(s)
相同。如果将指针初始化为 NULL,则始终可以使用 realloc
【参考方案1】:
例如函数malloc_ptr
void malloc_ptr(ENTRY** ssar)
*ssar = malloc(sizeof(*ssar));
(*ssar)[0].code = malloc(CODE_LEN * sizeof(char));
(*ssar)[0].qty = malloc(QTY_LEN * sizeof(char));
不正确并调用未定义的行为。
在此声明中
*ssar = malloc(sizeof(*ssar));
您需要分配一个 ENTRY 类型的对象,而不是一个指向该类型对象的指针。那就是你需要写
*ssar = malloc( sizeof( **ssar ) );
或
*ssar = malloc( sizeof( ENTRY ) );
函数realloc_ptr
也存在同样的问题。而不是这种说法
*ssar = realloc(*ssar, 5 * sizeof(*ssar));
你必须写
*ssar = realloc(*ssar, 5 * sizeof(**ssar));
或
*ssar = realloc(*ssar, 5 * sizeof( ENTRY ));
另外最好使用中间指针,因为函数可以返回一个空指针。在这种情况下,分配内存的先前地址将丢失。例如
ENTRY *tmp = realloc(*ssar, 5 * sizeof( ENTRY ));
if ( tmp != NULL ) *ssar = tmp;
而不是这两个语句
memcpy(ssar[0].code, "abcde", 5);
memset(ssar[0].code + 5, 0, 1);
写起来更简单
strcpy( ssar[0].code, "abcde" );
【讨论】:
谢谢!嗯..这是有道理的 另外感谢良好的编码练习技巧,我一定会使用中间指针以上是关于释放结构成员指向的内存的主要内容,如果未能解决你的问题,请参考以下文章
C 语言结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )
C 语言结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )