Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 是否总是不需要将全局和静态变量初始化为0?_C - Fatal编程技术网

C 是否总是不需要将全局和静态变量初始化为0?

C 是否总是不需要将全局和静态变量初始化为0?,c,C,C标准保证全局变量和静态变量,如果没有初始化,总是0 这里是我的问题:未初始化的全局变量和静态变量进入程序中的BSS段。因此,所谓的0应该是所有位0 对于积分变量,所有位0将被计算为0。如果遵循IEEE 754,则浮点变量也是0.0。但对于指针,空指针不一定是所有位0,全局指针的初始化也是如此: int* p = NULL; 有什么区别吗 int *p; 该标准保证具有静态存储持续时间且没有其他初始值设定项的指针将被初始化为空指针,而不管可能涉及什么位模式 同样的基本思想也适用于浮点和整数类

C标准保证全局变量和静态变量,如果没有初始化,总是
0

这里是我的问题:未初始化的全局变量和静态变量进入程序中的
BSS
段。因此,所谓的
0
应该是
所有位0

对于积分变量,
所有位0
将被计算为
0
。如果遵循IEEE 754,则浮点变量也是
0.0
。但对于指针,空指针不一定是
所有位0
,全局指针的初始化也是如此:

int* p = NULL;
有什么区别吗

int *p;

该标准保证具有静态存储持续时间且没有其他初始值设定项的指针将被初始化为空指针,而不管可能涉及什么位模式


同样的基本思想也适用于浮点和整数类型——它们也保证被初始化为0或0.0。实现可以将这一点留给这样一个事实,即BSS将所有位设置为0,当且仅当它“知道”这样做将产生正确的值时。

所有具有静态存储持续时间的变量都保证初始化为各自的零值,这通常并不意味着它们必须以零模式填充所有位

在某些特定平台上,这些变量可能会进入BSS段的原因是,在目标平台上,空指针实际上由全位零模式表示。也就是说,指针的全位零初始化恰好在该平台上正常工作,因此编译器使用BSS作为在该特定平台上实现正确行为的最简单和最有效的方法。如果不是这样,编译器将不得不以不同的方式初始化这些静态变量

这将适用于浮点值,例如,如果某些平台对此类值使用非IEEE 754表示,并使用非零位模式表示
0.0
(C不强制要求IEEE 754)

(此外,这甚至适用于大于
char
的所有整数类型,直到C99标准的一个TCs最终要求所有位零模式成为所有C平台上所有类型整数零的有效对象表示。)

一个好的现实例子来自C++(一种不同的语言,但在这种情况下是相关的)。C++对静态存储时间的标量变量也有同样的保证。同时,许多流行的C++实现使用<>代码> 0xFFFFFFFF> /COD>值来表示指针指向数据成员类型的空指针。例如

SomeType SomeClass::*p = 0;

实际上转换成一个模式,用所有位填充
p
。因此,如果在没有显式初始值设定项的情况下声明此类类型的静态变量,编译器将必须确保其初始值是所有位一模式,而不是所有位零模式。众所周知,有些编译器会将这些变量放入BSS而出错,因为它们忘记了这些变量,从而使这些变量充满了所有的零位模式。

这里有一些好信息:这不是关于
p
将具有什么值的注释。这是一个编码风格的想法。使用
int*p
时,它没有强调初始化为NULL的必要性。它表明初始值是一个不在乎的值,即使它是由
C
初始化为
NULL
<代码>int*p=NULL表示程序需要进行该初始化。这就是我所看到的区别。因此,未初始化的变量不必去BSS,这就解释了我的问题,谢谢。@YuHao:首先,我很确定标准实际上没有指定变量去哪里。只要它们出现在目标系统内存中的某个地方,就可以了。这段内存可能被称为“数据”、“bss”或“hhhaaa”。但是,它确实定义了全局变量和静态变量应该以某种方式初始化,因此实现必须“不惜一切代价”——这可能只是将其留在BSS中,让操作系统将其设置为零,或者它可能需要一些代码来填充某些位置,而不是零。@Yu Hao:它是否“转到BSS”并不重要。编译器始终可以生成启动初始化代码,该代码将覆盖“在BSS中”的任何效果。所以,BSS在这里是完全无关紧要的。@Matstpeterson和AndreyT:我现在明白你的意思了,不管目标系统是如何实现的,编译器都会生成正确的程序。我想我更了解计算机系统,衷心感谢他们。