【发布时间】: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
标签: c pointers struct malloc realloc