【问题标题】:C - How to free a struct array cell completelyC - 如何完全释放结构数组单元
【发布时间】:2014-07-15 08:26:57
【问题描述】:

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

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

typedef struct _event {
char* desc;
int start;
int end;
} event;

但似乎我只能释放 desc,而如果我尝试将 free 用于两个整数(开始/结束),它不起作用。 阅读其他帖子中的其他答案,我了解到我无法释放我没有 malloc 的东西。关键是:我不需要malloc() 一个整数。但在我的练习中,我真的需要擦除那个数组块。 (我不是指整个数组,只是那个块)。

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

目前我正在使用:

free(event[i].desc);

在某个if 语句下的for 循环中。 问题是如何 freeevent[i].startevent[i].end

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

附:如果你知道关于free()函数的好文章或教程,可以链接给我吗?

【问题讨论】:

  • 但是您不会为startend 分配内存,是吗?那你为什么要释放它?尝试释放尚未分配的内存可能会导致undefined behavior。此外,startend 成员就像普通变量一样,您不会尝试释放本地 int 变量吗?
  • 我们需要明白你所说的“免费”是什么意思:你是要重置startend的值还是要将这些变量占用的空间标记为可用,因为你不再需要它了?
  • 也许混乱来自人们谈论“释放指针”的草率方式。那不准确。你永远不会“释放指针”。相反,您释放了一些 内存,并通过一些指针来引用该内存。
  • “我真的需要擦除那个数组块。”你真的不能。想象一下整数数组。您不能简单地“删除”中间的一个元素。你需要在两个不同的层面上思考。一个是_event 的构造和解构(这是free(desc) 很重要的地方)。第二个是你如何组织和管理你的事件——这是你的_events 数组,但不管它是什么类型,你不能简单地从T array[SIZE] 中删除一个元素。您组合、混合和混淆了两个抽象级别。
  • 没有malloc,没有freemallocheap section 中分配内存,而freeheap section 中释放内存。在stack section 中分配的变量将是freed auto。你可以http://en.wikipedia.org/wiki/C_dynamic_memory_allocationhttp://man7.org/linux/man-pages/man3/malloc.3.html寻求帮助。

标签: c struct free


【解决方案1】:

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

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

希望这是你想知道的。

【讨论】:

  • 您好,我首先以这种方式分配了 bloc:event* eventi = (event*) malloc(sizeof(event)*n); 然后,我在 for 循环中为每个事件分配了单元格:eventi[i] = *(event*) malloc(sizeof(event)); 最后,我为字符串分配了空间 @987654325 @(其中 value 是一个 char[101])。但我得到一个类型错误(将类型事件传递给 void* )。对不起,我的帖子格式不好!我是新来的,我不知道如何在这些答案中开始一个新段落
  • @Roberto event* eventi = (event*) malloc(sizeof(event)*n);将分配 n 个事件。然后你需要在一个从0到n-1的for循环中do,分配给eventi[i]->desc,最后完成后,释放为free(eventi),仅此而已。
  • 谢谢@Debasish。抱歉,如果我的问题有点愚蠢,但我正在尝试真正了解 free() 函数的工作原理,这个线程对我帮助很大。
【解决方案2】:

重要的是要了解free 不能只是结构的一部分: 在您的情况下,您在 char 和 2 int 上有一个指针。

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

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

【讨论】:

  • 谢谢Cocoop,你真的很有帮助!我修好了,我的练习现在解决了!
猜你喜欢
  • 1970-01-01
  • 2010-09-30
  • 2014-10-26
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 2012-11-15
  • 1970-01-01
相关资源
最近更新 更多