从结构中释放分配的内存
Freeing Allocated Memory From A 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*/
}
我使用 print 语句来确定分段错误的位置,它看起来像在 destroyElement
函数中。
而不是 malloc(sizeof(temp->name))
,试试 malloc(sizeof(thing you want to put in temp->name)
。
您似乎正在尝试使用 sizeof(temp->name)
,您首先尝试分配的东西(如果 temp->name
现在正在分配,它的大小是多少?)
这有意义吗?
如果没有,请随时给 Judi 发送电子邮件,或在 Bucky 上询问。 ;)
user3711622 在他们说 malloc 行不正确时是正确的。在 createRecord 函数中,您输入 *name 和 *group。最好的方法是改变
temp->name = malloc(sizeof(temp->name));
到
temp->name = malloc(sizeof(char) * strlen(name));
从技术上讲,您可以使用值 26 而不是 strlen(name),因为 Judi 说她在测试文件中的名字永远不会超过 25 个字符,但就像 Judi 总是告诉我们的那样,防御性编程很好编程。
我正在向函数发送一个结构 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*/
}
我使用 print 语句来确定分段错误的位置,它看起来像在 destroyElement
函数中。
而不是 malloc(sizeof(temp->name))
,试试 malloc(sizeof(thing you want to put in temp->name)
。
您似乎正在尝试使用 sizeof(temp->name)
,您首先尝试分配的东西(如果 temp->name
现在正在分配,它的大小是多少?)
这有意义吗?
如果没有,请随时给 Judi 发送电子邮件,或在 Bucky 上询问。 ;)
user3711622 在他们说 malloc 行不正确时是正确的。在 createRecord 函数中,您输入 *name 和 *group。最好的方法是改变
temp->name = malloc(sizeof(temp->name));
到
temp->name = malloc(sizeof(char) * strlen(name));
从技术上讲,您可以使用值 26 而不是 strlen(name),因为 Judi 说她在测试文件中的名字永远不会超过 25 个字符,但就像 Judi 总是告诉我们的那样,防御性编程很好编程。