C语言不同声明方式下struct行为差异问题咨询
问题原因说明
这个现象是C语言的标准规定特性,不是编译器故障,核心和C语言不同存储周期变量的默认初始化规则有关:
- 静态存储期变量(全局变量、static修饰的局部变量):程序加载时会自动将所有成员初始化为对应类型的0值:int为0、double为0.0、指针为NULL
- 自动存储期变量(函数内部非static修饰的局部变量):如果没有显式初始化,成员值是完全不确定的,读取未初始化的变量属于未定义行为,任何运行结果都符合标准
对应代码的三个变量分析:
- 全局变量
strc:属于静态存储期,所有成员自动清零,所以第二条输出固定是0 0.000000 (null),符合预期 - 局部变量
defqu、defqu2:属于自动存储期,未显式初始化,成员值是栈内存里的残留垃圾值:- 第一次打印的int值、乱码字符串都是栈残留数据的随机表现
- 第三条打印没有输出,是因为
defqu2.string指向了非法内存地址,printf尝试读取该地址的字符串时触发了内存访问错误,程序直接崩溃终止,所以没等到第三条输出就退出了
相关知识点掌握必要性
这个是C语言最核心的基础规则之一,必须完全掌握:未定义行为是C程序出现莫名其妙崩溃、随机错误的最常见原因之一,不熟悉这个规则几乎写不出可稳定运行的C代码。
修复建议
如果要避免未定义行为,局部结构体变量必须显式初始化,最简单的方式是定义时统一置零:
// 所有成员自动初始化为对应类型的0值 struct s1 defqu = {0}; DStruct defqu2 = {0};
内容的提问来源于stack exchange,提问作者noname
相关产品推荐
相关产品推荐

