C语言结构体疑问:为何不能在该位置声明struct student s;?
C语言结构体定义时的变量声明错误解析
在学习C语言结构体时,你可能会疑惑:为什么不能在结构体定义的末尾直接写struct student s;?下面结合错误代码和正确代码,解析具体原因:
错误代码
#include<stdio.h> struct student { int num; char name[20]; float mark; }struct student s; // 此处写法违反语法规则 int main() { scanf("%d%s%f",&s.num,s.name,&s.mark); struct student *ptr=&s; printf("%d\n",s.num); printf("%d\n",ptr->num); printf("%d",(*ptr).num); return 0; }
正确代码
#include<stdio.h> struct student { int num; char name[20]; float mark; } int main() { struct student s; // 函数内声明结构体变量,语法合法 scanf("%d%s%f",&s.num,s.name,&s.mark); struct student *ptr=&s; printf("%d\n",s.num); printf("%d\n",ptr->num); printf("%d",(*ptr).num); return 0; }
错误原因解析
C语言对结构体定义的语法有明确规则:
- 若仅定义结构体类型,写完大括号后直接加分号即可,对应正确代码的写法。
- 若想在定义类型的同时声明全局变量,只需在大括号后直接写变量名,无需重复写
struct student。比如合法写法应为:struct student { int num; char name[20]; float mark; } s; // 直接写变量名s,完成类型定义+全局变量声明
错误代码中在大括号后写struct student s;属于语法错误——编译器会把重复的struct student识别为多余的无效语法,无法正确解析这条语句,因此编译报错。
而在main函数内部声明结构体变量时,必须写全struct student s;,这是因为函数内声明变量需要明确指定变量类型,这也是正确代码写法合法的原因。
内容的提问来源于stack exchange,提问作者Nadith Nemal
相关产品推荐
相关产品推荐

