两种初始化数组的方法。每个人会发生什么?

时间:2014-08-25 21:37:08

标签: c arrays

有两种方法(至少)在C中初始化数组。

之间有什么区别
int array[] = {1,2,3,4,5,6,7,8,9} ;

int array[100] = {1,2,3,4,5,6,7,8,9} ;

我不是指内存分配方式。也许引发这个问题的事情会有用,以便理解我的问题。

我希望通过迭代来获取int数组的长度。这是代码:

#include <stdio.h>
#include <stdlib.h>
int array[] = {1,2,3,4,5,6,7,8,9} ;
int i = 0 ; // i is length
while( array[i] ) {
    printf("%d\n" , array[i] ) ;
    i++ ;
}
printf("%d\n" , i) ;

我注意到当我使用array []时,由于某种溢出,长度有时是错误的,但是当我使用数组[100]时,长度总是正确的。这两者有什么区别? 它与&#39; \ 0&#39;有关吗?性格?

3 个答案:

答案 0 :(得分:5)

当您创建数组而未指定其大小时,编译器会从初始化程序中推断出它(在这种情况下,长度将为9)。阵列后面的内存位置具有未指定的内容,因为没有人为他们提供特定值而烦恼,这就是为什么你得到&#34;溢出&#34;行为 - 这在技术上是 undefined 行为,但结果是编译器供应商实现&#34; undefined&#34;的一种非常常见的方式。

当你明确指定编译器的大小时,使用你提供的元素来初始化数组,然后用零填充剩余的空间。

在这两种情况下,行为均符合标准。

答案 1 :(得分:3)

您可以使用sizeof运算符以编程方式获取数组的大小。因此,在这种情况下,您可以sizeof(array)/sizeof(int)来获取实际大小。 sizeof运算符由编译器处理,编译器将在编译时插入正确的大小常量。

请注意,迭代数组直到得到错误的结果是未定义的行为,不应该这样做。

关于你原来的问题,@ Jon是正确的;数组大小说明符是正确的,并将产生相同的结果。

答案 2 :(得分:1)

因为数字数组中没有空终止字符,所以只有char数组。因此,如果您的数组是c样式字符串,则您的代码将成功找到长度

相关问题