【问题标题】:Freeing Allocated Memory From A Struct从结构中释放分配的内存
【发布时间】:2015-04-01 02:53:48
【问题描述】:

我正在向函数发送一个 struct Food,该函数的工作是释放结构的分配内存,而不是结构本身。

结构如下所示:

struct Food{
char * name;
char * foodGroup;
double calories;
char type;
struct Food * next;
};

char *name 和 char *foodGroup 是在另一个函数中分配的内存。

struct Food* temp = malloc(sizeof(struct Food));
temp->name = malloc(sizeof(temp->name));       /*ERROR?*/
temp->foodGroup = malloc(sizeof(temp->name));  /*ERROR?*/
temp->next = malloc(sizeof(struct Food));

释放分配内存的函数如下所示:

void destroyElement(Food *theElement)
{
    free(theElement->name);  /*ERROR*/
    free(theElement->foodGroup);   /*ERROR*/
}

我使用打印语句来确定分段错误的位置,它看起来像它在destroyElement 函数中。

【问题讨论】:

  • 您可能在程序的其他地方造成堆损坏。 temp->name = malloc(sizeof(temp->name)); 这一行非常可疑。这可能分配了 4 个字节。您的其余代码是否确保不会溢出此缓冲区?
  • 要获得好的帮助,请发帖MCVE
  • 要获得更准确的结果,请使用调试器。打印语句可能会产生误导。
  • 除了destroyElement 函数外,您在任何地方都使用前缀struct 关键字引用了struct Food。从技术上讲,这甚至不能编译,你的问题应该是关于一些你没有提到的编译器错误消息。我支持@MattMcNabb 的 MCVE 请求,并投票支持关闭,理由是在提供 MCVE 之前无法重现问题。

标签: c memory memory-management struct


【解决方案1】:

试试malloc(sizeof(thing you want to put in temp->name),而不是malloc(sizeof(temp->name))

您似乎正在尝试使用 sizeof(temp->name),这是您首先尝试进行 malloc 的东西(如果 temp->name 现在正在被分配,它的大小是多少?)

这有意义吗?

如果没有,请随时给 Judi 发送电子邮件,或向 Bucky 提问。 ;)

【讨论】:

    【解决方案2】:

    当他们说 malloc 行不正确时,user3711622 是正确的。在 createRecord 函数中,您输入 *name 和 *group。最好的方法是改变 temp->name = malloc(sizeof(temp->name));temp->name = malloc(sizeof(char) * strlen(name));

    从技术上讲,您可以使用值 26 而不是 strlen(name),因为 Judi 说她在测试文件中永远不会有一个大于 25 个字符的名称,但就像 Judi 总是告诉我们的那样,防御性编程是好的编程。

    【讨论】:

      猜你喜欢
      • 2022-10-14
      • 2017-05-07
      • 1970-01-01
      • 2019-03-11
      • 2012-04-10
      • 2018-01-29
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      相关资源
      最近更新 更多