为什么我的C语言结构体声明未被编译器正确识别?
错误原因
- C语言的文件作用域(即你所说的代码顶部公共区域)仅支持变量、函数的声明,不允许编写可执行的赋值语句
- 你将调用
calloc给VtxsInLines赋值的代码写在了所有函数之外,编译器无法识别这是对已声明全局变量的赋值操作,会将这行代码判定为一次新的变量声明:- 兼容老式C标准的编译器会默认隐式声明的变量类型为
int,因此触发type defaults to 'int'警告 - 新声明的
int类型同名变量,和你之前声明的struct Vertex *类型的VtxsInLines类型冲突,直接报类型冲突错误
- 兼容老式C标准的编译器会默认隐式声明的变量类型为
- 后续所有对
VtxsInLines的指针操作(指针偏移、->取成员等),都会因为编译器将该变量识别为int类型而报错。
修复方案
- 保留全局区域的
struct Vertex *VtxsInLines;声明不变 - 将
calloc赋值的代码移动到main函数的最开头位置,在所有操作VtxsInLines的逻辑之前执行即可,示例代码:
int main(void) { // 第一行先完成内存分配 VtxsInLines = calloc(15000, sizeof(struct Vertex)); // 原有main函数逻辑保持不变 // ... }
优化建议
- 不需要强制转换
calloc的返回值,C语言中void*类型可以隐式转换为任意指针类型,去掉强制转换写法更简洁 - 程序退出前记得调用
free(VtxsInLines);释放分配的堆内存,避免内存泄漏
内容的提问来源于stack exchange,提问作者Steve Miller
相关产品推荐
相关产品推荐

