C中int数组的初始值
当在C中声明一个数组像这样:
int array[10];
什么是整数的初始值? 我用不同的编译器得到不同的结果,我想知道它是否与编译器或操作系统有关。
如果数组是在一个函数中声明的,那么这个值是未定义的。 int x[10];
在函数中的意思是:取得memroy的10-int-size区域的所有权,而不进行任何初始化。 如果数组声明为全局variables或函数中的static
variables,则所有元素如果尚未初始化,则初始化为零。
由标准设置,所有全局和函数静态variables自动初始化为0.自动variables不被初始化。
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 }
然而,不pipe存储类是什么,总是手动初始化函数variables是一个好习惯。 要将所有数组元素设置为0,只需将第一个数组项设置为0 – 省略元素将自动设置为0:
int b[10] = {0};
为什么函数本地( auto
存储类)没有初始化时,一切都是?
C接近硬件; 这是它最大的力量和最大的危险。 auto
存储类对象具有随机初始值的原因是因为它们被分配在堆栈上,并且devise决定不会自动清除这些(部分原因是因为它们需要在每次函数调用时清除)。
另一方面,非auto
对象只需要清除一次。 另外,由于安全原因,操作系统必须清除分配的页面。 所以这里的devise决定是指定零初始化。 为什么安全也不是堆栈的问题呢? 事实上,它首先被清除。 你看到的垃圾是从你自己的程序的调用框架和他们所调用的库代码的早期实例。
最终的结果是快速,高效的代码。 assembly的所有优点都没有什么痛苦。 在dmr发明C之前,HLL就像Basic和整个OS内核一样,实际上是作为巨型汇编程序来实现的。 (在像IBM这样的地方有一些例外)
根据C标准,6.7.8(注10):
如果具有自动存储持续时间的对象未被显式初始化,则其值是不确定的。
所以这取决于编译器。 使用MSVC,debugging版本将使用0xcc初始化自动variables,而非debugging版本根本不会初始化这些variables。
在大多数最新的编译器(如gcc / vc ++)中,部分初始化的本地数组/结构成员默认初始化为零(int),NULL(char / charstring),0.000000(float / double)。
除了上面的本地数组/结构数据之外,静态(全局/本地)和全局空间成员也保持相同的属性。
int a[5] = {0,1,2}; printf("%d %d %d\n",*a, *(a+2), *(a+4)); struct s1 { int i1; int i2; int i3; char c; char str[5]; }; struct s1 s11 = {1}; printf("%d %d %d %c %s\n",s11.i1,s11.i2, s11.i3, s11.c, s11.str); if(!s11.c) printf("s11.c is null\n"); if(!*(s11.str)) printf("s11.str is null\n");
在gcc / vc ++中,输出应该是:
0 2 0 1 0 0 0.000000 s11.c为空s11.str为空
ACvariables声明只是告诉编译器为你预留和命名一个内存区域。 对于自动variables,也称为堆栈variables,该内存中的值不会改变它们之前的值。 程序启动时,全局variables和静态variables设置为零。
一些编译器在未优化的debugging模式下将自动variables设置为零。 然而,在较新的编译器中,将这些值设置为已知的错误值已经变得很常见,因此程序员不会在不知不觉中编写依赖于被设置为零的代码。
为了让编译器为你设置一个数组为零,你可以把它写成:
int array[10] = {0};
更好的是设置数组应该有的值。 这是更有效的,避免了两次写入数组。
来自http://www.cplusplus.com/doc/tutorial/arrays/的文章;
概要:
初始化数组。 当声明一个局部范围的规则数组(例如在一个函数内)时,如果我们没有另外指定,它的元素默认情况下不会被初始化为任何值,所以在我们存储一些值之前,它们的内容是不确定的。 另一方面,全局数组和静态数组的元素会自动初始化为默认值,对于所有基本types,这意味着它们被零填充。
在这两种情况下,局部和全局,当我们声明一个数组的时候,我们可以通过把值放在大括号{}中来为它的每一个元素分配初始值。 例如:
int billy [5] = { 16, 2, 77, 40, 12071 };