Oracle Solaris Studio 12.2:C 用户指南

B.2.84.1 -xcheck=init_local 的初始化值

使用 -xcheck=init_local,编译器在没有初始化程序的情况下,将声明的局部变量初始化为下表中所示的预定义值:(注意这些值会发生更改,因此不应该依赖它们。)

基本类型

表 B–20 基本类型的 init_local 初始化

类型 

初始化值 

Char, __Bool

0x85

short

0x8001

int, long, enum     (-m32)

0xff80002b

long    (-m64)

0xfff00031ff800033

long long

0xfff00031ff800033

pointer

0x00000001 (-m32)

0x0000000000000001 (-m64)

float, float _Imaginary

0xff800001

float _Complex

0xff80000fff800011

double

SPARC: 0xfff00003ff800005

x86: 0xfff00005ff800003

double _Imaginary

0xfff00013ff800015

long double, long double _Imaginary

SPARC: 0xffff0007ff800009 / 0xfff0000bff80000d

x86: 12 bytes (-m32): 0x80000009ff800005 / 0x0000ffff

x86 - 16 bytes (-m64): 0x80000009ff800005 / 0x0000ffff00000000

double _Complex

0xfff00013ff800015 / 0xfff00017ff800019

long double _Complex

SPARC: 0xffff001bff80001d / 0xfff0001fff800021 / 0xffff0023ff800025 / 0xfff00027ff800029

x86 - 12 bytes (-m32): 0x7fffb01bff80001d / 0x00007fff / 0x7fffb023ff800025 / 0x00007fff

x86 - 16 bytes (-m64): 0x00007fff00080000 / 0x1b1d1f2100000000 / 0x00007fff00080000 / 0x2927252300000000

注意,为结合计算的 goto 使用而声明的局部变量(即简单的 void * 指针),将根据上表中所述的指针说明进行初始化。

永远不会初始化以下局部变量类型:限定的 constregister、计算的 goto 的标签号、局部标签、可变长度数组 (VLA)

初始化结构、联合和数组

struct 中作为基本类型的域将根据上表中所述进行初始化,union 中第一个声明的 pointerfloat 域也是如此。这样便最大程度地增加了未初始化引用生成可见错误的可能性。

数组元素也按上表所述进行初始化。

按如上所述对内嵌 structunion、数组域进行初始化,但以下情况除外:struct 包含位域,union 没有 pointerfloat 域,或者数组类型无法进行完整的初始化。将使用用于类型 double 的局部变量的值对它们进行初始化。不对可变长度组数进行初始化。