C语言调用free函数时参数类型不兼容错误求助
问题排查与解决:free参数类型不兼容错误
错误原因
free() 仅能释放通过malloc()/calloc()/realloc()等函数从堆上动态申请的内存,你代码中的a、b、c是栈上的局部结构体实例(直接声明的变量,不是动态分配的指针):
- 首先,
free()要求参数是void*类型,你传入的是结构体实例本身,类型不匹配,直接触发编译错误; - 其次,栈内存由系统自动管理,不需要也绝对不能手动调用
free()释放。
解决方案
分两种场景处理:
场景1:继续使用栈上节点
直接删除free(a);、free(b);、free(c);这三行代码即可,栈内存会在程序执行完毕或变量离开作用域时由系统自动回收。
场景2:改用动态分配的堆内存(标准链表实现方式)
如果需要手动管理链表内存,必须用动态分配创建节点,示例代码如下:
#include <stdio.h> #include <stdlib.h> // 补全结构体定义(你代码中的strutto应为拼写错误) struct Node { int dato; struct Node *next; }; int main() { struct Node *head, *cdm, *a, *b, *c; // 动态分配每个节点,分配后需检查是否成功(示例省略检查,实际开发要加) a = malloc(sizeof(struct Node)); b = malloc(sizeof(struct Node)); c = malloc(sizeof(struct Node)); // 给节点赋值 a->dato = 1; b->dato = 2; c->dato = 3; // 构建链表 head = a; a->next = b; b->next = c; c->next = NULL; // 遍历链表 cdm = head; do { printf("%d\n", cdm->dato); cdm = cdm->next; } while(cdm != NULL); // 正确释放链表内存:先保存下一个节点,再释放当前节点 cdm = head; while(cdm != NULL) { struct Node *temp = cdm; cdm = cdm->next; free(temp); } return 0; }
注意:动态分配后务必检查malloc()的返回值是否为NULL,避免内存分配失败引发的异常;释放链表时必须先保存下一个节点的地址,否则释放当前节点后会丢失后续节点指针,造成内存泄漏。
内容的提问来源于stack exchange,提问作者Valentin Constantin
相关产品推荐
相关产品推荐

