C语言使用结构体时出现类型不完整等报错该如何解决
错误原因排查
- 结构体定义顺序错误:C语言遵循从上到下的编译规则,你将
struct student的定义放在了main函数之后,编译器在处理main函数里的struct student s1声明时,还没有读取到结构体的完整定义,只知道这是一个结构体类型,无法确定它的存储空间大小,所以会抛出variable ‘s1’ has initializer but incomplete type、storage size of ‘s1’ isn’t known两个错误,后续的初始化元素多余警告也是这个原因衍生的。 - 全局变量与局部变量重名:你在定义
struct student的同时声明了全局变量s1,而main函数里又声明了同名的局部变量s1,属于不规范的重复定义写法。 - 字符数组长度不足:结构体里
name字段定义的长度是4,但是你初始化的字符串"Nick"加上末尾的\0结束符一共需要5字节的存储空间,会发生数组越界,运行时会出现未定义行为。
修复后的代码
#include<stdio.h> #include<stdlib.h> // 结构体定义移到main函数之前,保证编译器提前识别类型 struct student{ char name[5]; // 长度修改为5,足够存储"Nick"+\0结束符 int age; int roll_no; float marks; }; // 去掉全局变量s1的声明,避免重名冲突 int main() { struct student s1 = {"Nick",16,50,72.5}; printf("%s",s1.name); return 0; }
内容的提问来源于stack exchange,提问作者parker
相关产品推荐
相关产品推荐

