buz*_*ali 43 c arrays compiler-construction
在C中声明一个数组时,如下所示:
int array[10];
Run Code Online (Sandbox Code Playgroud)
整数的初始值是多少?我用不同的编译器得到了不同的结果,我想知道它是否与编译器或操作系统有关.
Ara*_*raK 61
如果在函数中声明了数组,则该值是未定义的.int x[10];在函数中意味着:在不进行任何初始化的情况下获取10-int-size memroy区域的所有权.如果将数组声明为全局数组或static函数中的数组,则如果未初始化数组,则将所有元素初始化为零.
qrd*_*rdl 20
由标准设置,所有全局和函数静态变量自动初始化为0.自动变量未初始化.
int a[10]; // global - all elements are initialised to 0
void foo(void) {
int b[10]; // automatic storage - contain junk
static int c[10]; // static - initialised to 0
}
Run Code Online (Sandbox Code Playgroud)
但是,无论其存储类如何,始终手动初始化函数变量都是一种好习惯.要将所有数组元素设置为0,您只需将第一个数组项分配给0 - 省略的元素将自动设置为0:
int b[10] = {0};
Run Code Online (Sandbox Code Playgroud)
Dig*_*oss 12
auto其他一切都没有初始化函数本地(存储类)?C靠近硬件; 这是它最大的力量和最大的危险.究其原因auto存储类对象具有随机初始值,是因为他们在栈上分配,和设计决定不自动清除这些(部分原因是因为他们需要对每个函数调用将被清除).
另一方面,非auto对象只需要清除一次.此外,出于安全原因,操作系统必须清除已分配的页面.所以这里的设计决定是指定零初始化.为什么安全性也不是堆栈的问题?实际上它一开始就被清除了.您看到的垃圾来自您自己程序的调用框架的早期实例和它们调用的库代码.
最终结果是快速,节省内存的代码.装配的所有优点都没有痛苦.在dmr发明C之前,"HLL"就像Basic和整个操作系统内核一样,实际上是作为巨型汇编程序实现的.(在IBM这样的地方有某些例外情况.)
根据C标准,6.7.8(注10):
如果未显式初始化具有自动存储持续时间的对象,则其值不确定.
所以这取决于编译器.使用MSVC,调试版本将使用0xcc初始化自动变量,而非调试版本将根本不初始化这些变量.
AC变量声明只是告诉编译器预留并为您命名一个内存区域.对于自动变量(也称为堆栈变量),该内存中的值不会与之前的值相同.程序启动时,全局变量和静态变量设置为零.
一些处于未优化调试模式的编译器将自动变量设置为零.但是,在较新的编译器中将值设置为已知的错误值已经变得很常见,因此程序员不会在不知不觉中编写依赖于设置为零的代码.
为了让编译器为您设置一个数组为零,您可以将其写为:
int array[10] = {0};
Run Code Online (Sandbox Code Playgroud)
更好的是使用它应该具有的值来设置数组.这样更有效,并避免两次写入数组.