【发布时间】: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