C-如何完全释放结构数组单元

C-如何完全释放结构数组单元,c,struct,free,C,Struct,Free,我在这里阅读了一些关于堆栈溢出的其他问题,并修复了使用free()时遇到的问题 我有一个这种类型的结构数组: typedef struct _event { char* desc; int start; int end; } event; 但似乎我只能释放desc,而如果我尝试对两个整数(开始/结束)使用free,它就不起作用了。 阅读其他帖子中的其他答案,我明白我不能释放一些我没有释放的东西。关键是:我不需要malloc()一个整数。但在我的练习中,我真的需要删除那个数组块。(我不是指整个阵

我在这里阅读了一些关于堆栈溢出的其他问题,并修复了使用free()时遇到的问题

我有一个这种类型的结构数组:

typedef struct _event {
char* desc;
int start;
int end;
} event;
但似乎我只能释放
desc
,而如果我尝试对两个整数(开始/结束)使用free,它就不起作用了。 阅读其他帖子中的其他答案,我明白我不能释放一些我没有释放的东西。关键是:我不需要
malloc()
一个整数。但在我的练习中,我真的需要删除那个数组块。(我不是指整个阵列,只是那个块)

我不想在这篇文章中添加太多代码,以免打扰读者,但如果你需要,请告诉我

目前我正在使用:

free(event[i].desc);
在某个
if
语句下的
for
循环中。 问题是如何
释放
事件[i]。开始
事件[i]。结束

提前谢谢,对于这个愚蠢的问题我很抱歉,但我想知道是否可以释放整个单元格,而不是使用像“0”这样的标记


另外,如果你知道一篇关于
free()
函数的好文章或教程,你能链接到我吗?

如果你将事件分配为块,例如

event * p = (event *) malloc(sizeof(event);
p->desc = (char *) malloc (sizeof(char) * SIZE); // presume SIZE defined earlier
然后,您可以按如下相反顺序释放:

free(p->desc);
free(p); // will deallocate the entire block

希望这就是您想要知道的。

如果您将事件分配为块,例如

event * p = (event *) malloc(sizeof(event);
p->desc = (char *) malloc (sizeof(char) * SIZE); // presume SIZE defined earlier
然后,您可以按如下相反顺序释放:

free(p->desc);
free(p); // will deallocate the entire block

希望这就是您想要知道的。

如果您将事件分配为块,例如

event * p = (event *) malloc(sizeof(event);
p->desc = (char *) malloc (sizeof(char) * SIZE); // presume SIZE defined earlier
然后,您可以按如下相反顺序释放:

free(p->desc);
free(p); // will deallocate the entire block

希望这就是您想要知道的。

如果您将事件分配为块,例如

event * p = (event *) malloc(sizeof(event);
p->desc = (char *) malloc (sizeof(char) * SIZE); // presume SIZE defined earlier
然后,您可以按如下相反顺序释放:

free(p->desc);
free(p); // will deallocate the entire block

希望这就是你想要知道的。

重要的是要理解,你不能
释放
只是你结构的一部分: 在您的例子中,指针指向
char
和2
int

char*
可以存储通过
malloc
获得的地址:可以释放该地址。但是2
int
不能。 如果出于某种原因,它们变得无关紧要,而您真的需要去掉这些变量,那么您可能以错误的方式定义了您的结构:您可能想要拆分它


另一种解决方案是使用默认值(如
0
-1
或您定义的任何值)重置这些字段,并释放
字符*
,正如@Debasish Jana解释的那样。

重要的是要理解,您不能
仅释放结构的一部分:
在您的例子中,指针指向
char
和2
int

char*
可以存储通过
malloc
获得的地址:可以释放该地址。但是2
int
不能。 如果出于某种原因,它们变得无关紧要,而您真的需要去掉这些变量,那么您可能以错误的方式定义了您的结构:您可能想要拆分它


另一种解决方案是使用默认值(如
0
-1
或您定义的任何值)重置这些字段,并释放
字符*
,正如@Debasish Jana解释的那样。

重要的是要理解,您不能
仅释放结构的一部分:
在您的例子中,指针指向
char
和2
int

char*
可以存储通过
malloc
获得的地址:可以释放该地址。但是2
int
不能。 如果出于某种原因,它们变得无关紧要,而您真的需要去掉这些变量,那么您可能以错误的方式定义了您的结构:您可能想要拆分它


另一种解决方案是使用默认值(如
0
-1
或您定义的任何值)重置这些字段,并释放
字符*
,正如@Debasish Jana解释的那样。

重要的是要理解,您不能
仅释放结构的一部分:
在您的例子中,指针指向
char
和2
int

char*
可以存储通过
malloc
获得的地址:可以释放该地址。但是2
int
不能。 如果出于某种原因,它们变得无关紧要,而您真的需要去掉这些变量,那么您可能以错误的方式定义了您的结构:您可能想要拆分它


另一种解决方案是使用默认值(如
0
-1
或您定义的任何值)重置这些字段,并按照@Debasish Jana的解释释放
字符*

但您没有为
开始
结束
分配内存,是吗?那你为什么要释放它?试图释放尚未分配的内存可能导致错误。此外,成员
start
end
与普通变量类似,您不会试图释放本地
int
变量,对吗?我们需要理解您所说的“free”是什么意思:您是想重置
开始
结束
的值,还是想将这些变量占用的空间标记为可用空间,因为您不再需要它了?可能是因为人们谈论“释放指针”的方式过于草率。那不准确。你永远不会“释放指针”。相反,你可以释放一些内存,然后通过指针引用这些内存。“我真的需要擦除那个数组块。”你真的不能。想象一下整数数组。你不能简单地“删除”中间的一个元素。你需要从两个不同的层面来思考。一个是
\u事件的构造和解构(这是
自由(desc)
很重要的地方)。第二个问题是如何组织和管理事件-这是
\u事件的数组,但不管它是什么类型,都不能简单地从
t数组[SIZE]
中删除元素。你把这两个抽象层次结合在一起,混合在一起,混淆在一起