📜  C C++中未初始化的原始数据类型(1)

📅  最后修改于: 2023-12-03 14:39:37.009000             🧑  作者: Mango

C/C++中未初始化的原始数据类型

在C/C++语言中,未初始化的原始数据类型指的是在定义时没有被明确地初始化的变量,如下示例:

int i; // 未初始化的整型变量
double d; // 未初始化的双精度浮点型变量

这些未初始化的变量存储在内存中的段落被称为bss段,其值为0,因此访问这些变量时会得到默认值0。但需要注意的是,这些变量未经初始化可能包含任意值,后续的操作可能会出现异常行为。

bss段

当程序执行时,系统会将可执行文件中的所有指令放入代码段中进行读取执行,而所有未初始化的全局变量以及被定义为static的局部变量会被放入bss段。

bss段是一块特殊的内存区域,与数据段和堆栈段不同,它在可执行文件中并不占用磁盘空间,而是在程序加载时由系统自动清零。因此,bss段中的变量默认值均为0。

未初始化变量的值

虽然bss段中的未初始化全局变量及static局部变量默认初值为0,但对于未初始化的自动变量(即局部变量),其初值是未知的,因为这些变量的存储方式与全局变量不同,存储在栈中或寄存器中,因此其初值是不稳定的。

以下是一些常见的未初始化变量的值:

  • 整型:不可预测的值,有可能是0或任意其他值。
  • 浮点型:不可预测的值,有可能是0或任意其他值。
  • 指针类型:任意非空值,往往是随机的地址值。
  • 字符型:一般为'\0'(字符串结束标志)或任意其他值。
  • 结构体:其成员变量值也是未定义的。
防范未初始化变量

由于未初始化变量初值不稳定,可能会导致程序出现奇怪的行为,甚至崩溃,因此程序员应该避免使用未初始化变量,当然也可以手动将其赋值为可控值。

此外,有些编译器提供了编译开关选项,可以将未初始化变量的值全部初始化为零或NaN等特殊值,便于后续运算。

总结

本文介绍了C/C++语言中未初始化的原始数据类型,未初始化变量存储于bss段,其默认值为0,并且访问未初始化变量可能会产生不稳定的结果。因此,程序员应该避免使用未初始化变量或手动初始化其值。