C标准保证全局和静态变量,如果没有初始化,始终是0。
我的问题是:未初始化的全局变量和静态变量转到程序中的BSS段。所以所谓的0应该是all-bit 0。
对于积分变量,all-bit 0将被计算为0。浮点变量(如果遵循IEEE754)也是0.0。但是对于指针,空指针不一定是all-bit 0,全局指针的初始化也是如此:
int* p = NULL;对以下几个方面有任何不同:
int *p;发布于 2013-06-09 18:21:00
该标准保证具有静态存储持续时间的指针和没有其他初始化器的指针将被初始化为空指针,而不管可能涉及什么位模式。
同样的基本思想也适用于浮点数和整数类型--它们也保证初始化为0或0.0。当BSS将所有位设置为0时,只有当它“知道”这样做将导致正确的值时,实现才能这样做。
发布于 2013-06-09 18:25:29
所有具有静态存储持续时间的变量都保证其各自的零值,这通常并不意味着它们必须物理上填充所有位-零模式。
这些变量可能会转到特定平台上的BSS段的原因是,在目标平台上,空指针确实是由全位零模式表示的。也就是说,指针的全位零初始化恰好在该平台上正确工作,因此编译器使用BSS作为在特定平台上实现正确行为的最简单和最有效的方法。如果不是这样,编译器将不得不以不同的方式初始化这些静态变量。
这将适用于浮点值,例如,如果某些平台使用非IEEE 754表示来表示这些值,并且使用非零位模式来表示0.0 (C不强制IEEE 754)。
(此外,这甚至适用于所有大于char的整数类型,直到C99标准的TCs之一最终要求所有C平台上的所有类型的整数零作为有效的对象表示。)
一个很好的实际例子来自C++ (一种不同的语言,但在本例中是相关的)。C++为具有静态存储持续时间的标量变量提供了相同的保证。同时,许多流行的C++实现使用0xFFFFFFFF值来表示指针到数据成员类型的空指针.例如。
SomeType SomeClass::*p = 0;实际上,将代码转换为用所有位一模式填充p的代码。因此,如果在没有显式初始化器的情况下声明此类类型的静态变量,编译器将必须确保其初始值为所有位-一个模式,而不是所有位-零模式。众所周知,一些编译器错误地将这些变量放入BSS中,忘记了这些变量,从而使这些变量被全位零模式填充。
https://stackoverflow.com/questions/17012707
复制相似问题