使用malloc分配结构体数组时出现类型相关错误的技术咨询
嘿,我来帮你把这两个报错的根源讲明白,都是C语言里关于全局变量和代码位置的基础坑,新手很容易踩~
先看你写的代码:
#include <stdlib.h> #include <stdio.h> struct CELL { char* data; struct CELL* next; } ; struct CELL* table; // 下方代码会报错 table = malloc(SIZE * sizeof(struct HASHCELL));
第一个警告+错误的原因:全局作用域不能直接用函数赋值
C语言有个规则:全局变量的初始化只能用常量值,像malloc()这种函数调用是运行时才会执行的动态操作,根本不能直接写在函数外面(全局作用域)来给全局变量赋值。
当你在全局作用域写table = malloc(...);的时候,编译器会把这行当成一个全新的变量声明——因为你没写类型,C语言老规则会默认把它当成int table;。这就和你之前声明的struct CELL* table;撞名字了,所以就出现了:
- 警告说“缺少类型说明符,默认是int”:编译器把这行当成了int类型的table声明
- 错误说“table重定义,int和struct CELL*类型冲突”:同一个名字被定义成两种不同类型,编译器当然不干啦
还有个隐藏小问题:struct HASHCELL没定义
你代码里用了sizeof(struct HASHCELL),但从头到尾只定义了struct CELL,这也是个要改的地方,得改成sizeof(struct CELL)才对。
怎么修复?
把内存分配的代码放到函数里面,比如最常用的main()函数里就行:
#include <stdlib.h> #include <stdio.h> // 先给SIZE定义一个值,比如10 #define SIZE 10 struct CELL { char* data; struct CELL* next; } ; struct CELL* table; // 全局变量声明 int main() { // 把malloc放到函数里执行,这才是合法的 table = malloc(SIZE * sizeof(struct CELL)); // 千万记得检查malloc是否成功!分配失败会返回NULL if (table == NULL) { perror("malloc failed"); return 1; } // 这里写你后续的业务代码... // 用完内存记得释放,避免内存泄漏 free(table); return 0; }
要是你不需要全局变量,也可以直接在函数里声明并分配:
int main() { struct CELL* table = malloc(SIZE * sizeof(struct CELL)); // ...业务代码... free(table); return 0; }
内容的提问来源于stack exchange,提问作者user4672
相关产品推荐
相关产品推荐

