如何修复C语言函数调用时指定参数出现'incompatible type'报错
C语言链表节点创建函数编译类型不匹配问题
原始代码定义
我在头文件中做了如下定义/声明:
typedef enum NODETYPE { HEAD = -1, BODY = 0, TAIL = 1 } NodeType; /* node struct */ typedef struct NODE { enum NODETYPE type; int len; struct NODE * next; } Node; /* create node */ static Node CreateNode(NodeType type, int len, Node child) { Node n = (Node){type, len}; n.next = &child; return n; } #define CREATE_NODE(type, len, node) CreateNode((type), (len), (node))
使用Code::Blocks编译时收到如下报错:
285 | error: incompatible type for argument 3 of 'CreateNode'
第285行就是上述#define语句。另外我对宏做了如下扩展:
#define TLNODE() CREATE_NODE(TAIL, -1, NULL) #define HDNODE() CREATE_NODE(HEAD, -1, TLNODE())
代码调用方式:
Node head = HDNODE();
问题根源
- 首先是
CreateNode函数的第三个参数类型定义错误:你声明的是Node child(结构体值类型),但实际传入的参数是NULL,NULL是指针类型,和值类型完全不匹配,所以直接报参数类型不兼容的错误。 - 其次就算不传
NULL,原函数逻辑也存在严重的悬空指针问题:你把形参child的地址赋值给了新节点的next指针,但child是栈上的临时变量,函数返回后这段内存就会被系统回收,后续访问next指针属于非法内存访问。
修复逻辑说明
你后续的修改完全解决了上述问题:
- 将
CreateNode的第三个参数改为struct NODE* child指针类型,和NULL、其他节点指针的类型匹配,直接解决编译报错。 - 改为使用
malloc在堆上分配节点内存,避免了栈内存自动回收导致的悬空指针问题,节点生命周期可以自主控制。 - 宏定义同步修改为返回指针类型,和函数返回值匹配。
内容的提问来源于stack exchange,提问作者IAbstract
相关产品推荐
相关产品推荐

