C中int数组的初始值

时间:2009-09-12 03:45:49

标签: c arrays compiler-construction

在C中声明一个数组时:

int array[10];

整数的初始值是多少?我用不同的编译器得到了不同的结果,我想知道它是否与编译器或操作系统有关。

10 个答案:

答案 0 :(得分:61)

如果在函数中声明了数组,则该值是未定义的。函数中的int x[10];表示:在不进行任何初始化的情况下获取10-int-size memroy区域的所有权。如果数组在函数中被声明为全局数组或static,则如果它们尚未初始化,则所有元素都将初始化为零。

答案 1 :(得分:21)

根据标准设置,所有全局和函数静态变量自动初始化为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
}

但是,无论其存储类如何,始终手动初始化函数变量都是一种好习惯。要将所有数组元素设置为0,您只需将第一个数组项分配给0 - 省略的元素将自动设置为0:

int b[10] = {0};

答案 2 :(得分:11)

为什么函数本地(auto存储类)在其他所有内容时都没有初始化?

C接近硬件;这是它最大的力量和最大的危险。 auto存储类对象具有随机初始值的原因是因为它们是在堆栈上分配的,并且设计决策不会自动清除这些(部分原因是它们需要在每次函数调用时清除)。 / p>

另一方面,非auto对象只需要清除一次。此外,出于安全原因,操作系统必须清除已分配的页面。所以这里的设计决定是指定零初始化。为什么安全性也不是堆栈的问题?实际上它一开始就被清除了。您看到的垃圾来自您自己的程序调用框架的早期实例以及它们调用的库代码。

最终结果是快速,内存效率高的代码。装配的所有优点都没有痛苦。在dmr发明C之前,“HLL”就像Basic和整个操作系统内核一样,实际上是作为巨型汇编程序实现的。 (在像IBM这样的地方有某些例外。)

答案 3 :(得分:7)

根据C标准,6.7.8(注10):

  

如果对象具有自动功能   存储持续时间未初始化   显然,它的价值是   不确定的。

所以这取决于编译器。使用MSVC,调试版本将使用0xcc初始化自动变量,而非调试版本将不会初始化这些变量。

答案 4 :(得分:5)

C变量声明只是告诉编译器预留并为您命名一个内存区域。对于自动变量(也称为堆栈变量),该内存中的值不会与之前的值相同。程序启动时,全局变量和静态变量设置为零。

一些未经优化的调试模式的编译器将自动变量设置为零。但是,在较新的编译器中将值设置为已知的错误值已经变得很常见,这样程序员就不会在不知不觉中编写依赖于设置为零的代码。

为了让编译器为你设置一个数组为零,你可以把它写成:

int array[10] = {0};

更好的是将数组设置为应具有的值。这样效率更高,避免两次写入数组。

答案 5 :(得分:4)

在大多数最新的编译器(例如gcc / vc ++)中,部分初始化的本地数组/结构成员默认初始化为零(int),NULL(char / char字符串),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为空

答案 6 :(得分:3)

来自http://www.cplusplus.com/doc/tutorial/arrays/

的文字
  

摘要:

     

初始化数组。宣布时   常规的局部范围数组(在一个范围内)   例如,如果我们不这样做的话   否则,其元素将   不被初始化为任何值   默认,所以他们的内容将是   直到我们存储一些价值才确定   在他们中。全球和。的要素   另一方面,静态数组是   用他们自动初始化   默认值,适用于所有人   基本类型这意味着它们   充满了零。

     

在这两种情况下,本地和全球,何时   我们声明一个数组,我们有   分配初始值的可能性   通过它的每一个元素   将值括在大括号{}中。   例如:

int billy [5] = { 16, 2, 77, 40, 12071 };

答案 7 :(得分:0)

C标准的相关部分(重点是矿井)

  

5.1.2执行环境

     

所有具有静态存储持续时间的对象应在程序启动之前初始化(设置为其初始值)。

     

6.2.4对象的存储期限

     

通过外部或内部链接或使用存储类说明符声明的标识符的对象具有静态存储持续时间。

     

6.2.5类型

     

数组和结构类型统称为聚集类型。

     

6.7.8初始化

     

如果具有自动存储持续时间的对象是 未明确初始化 ,则其 值是不确定的 > 。如果具有静态存储持续时间的对象是 未明确初始化 ,则 然后

     
      
  • 如果具有指针类型,则将其初始化为空指针;
  •   
  • 如果具有算术类型,则将其初始化为(正数或无符号);
  •   
  • 如果它是集合,则根据这些规则(递归)初始化每个成员;
  •   
  • 如果是联合,则将根据这些规则(递归)初始化第一个命名成员。
  •   

答案 8 :(得分:0)

这取决于阵列的位置。 如果它是全局/静态数组,它将是 bss 部分的一部分,这意味着它将在运行时由 C 复制例程初始化为零。 如果它是函数内部的局部数组,那么它将位于stack内并且初始值未知。

答案 9 :(得分:-1)

如果数组是在函数内部声明的,则它具有未定义的值,但如果数组声明为全局数组或在函数内部是静态的,则数组的默认值为 0。