开发者社区 问答 正文

C 数组的初始化问题 ?

今天看了一个代码:

int main(){
  char buff[10];
   printf("%d\n", buff[2]);   // 输出一些随机的数字或字符
   return(0);
}

我也很久没接触C了,和我印象中C数组的声明有些不一样。我记得数组需要一些初始化的,类似 char buff[10] = {0}; 或者 static char buff[10];。为何上面的数组不需要初始化??还是我本来就记错了??

是不是当char buff[10]的时候,已经在内存中的什么地方为这个数组分配了空间??当我用gdb调试的时候,print buff,会输出_000%000000000000?177。

谢谢解疑。

展开
收起
a123456678 2016-06-06 09:29:45 2191 分享
分享
版权
举报
1 条回答
写回答
取消 提交回答
  • “初始化”这个术语确实有些误导。不能顾名思义。数组的所谓“初始化”并非是“给数组分配内存”,而仅仅是“归零数组”。

    用 char *string[10] 这样的语句,就已经声明了数组,并分配了储存空间。储存空间是在栈上静态分配的。这时数组是可以使用的。
    
    但由于每一个程序分配到的内存都是“二手”的,里面可能有上一个程序保存的数据,因此这时,数组中的内容是随机内容。因此,我们需要对数组进行归零。这就叫数组的初始化。
    
    对于数组的归零,有三种方式。考虑 int a[10] 这个数组:
    
    手工用 a[0] = 0; a[1] = 0; a[2] = 0…… 这样的语句
    这种做法是非常可笑的,效率低,容易出错,不应该使用。
    使用循环 for (i = 0; i < 10; i++) a[i] = 0;
    这种做法本质上是和方法 1 相同的。效率很低,容易出错。不过 gcc 等高级编译器可以优化成 memset(),因此一定要使用一款好的编译器。微软的编译器就不多说了。
    memset(a, 0, 10)
    不错的方法,这种方法使用的很广泛。但由于不是声明时就初始化,比较繁琐。
    int a[10] = {0};
    好方法。这在声明时就给数组指定了全部是 0 的内容。
    有人要问了,哪里有这样的?难道不是:int a[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 吗?实际上,只写一个 0 是一种简便写法,所有元素都会被设置成 0,一目了然。
    不同的编译器,或同款编译器在不同的编译选项下,可能会把数组自动清零。这种情况下,容易遗忘初始化数组。要小心 Debug 模式没问题,Release 模式有问题的陷阱。
    
    不过,如果你能保证,你访问的数组内容之前,已经向数组保存了有意义的数据,比如在使用 a[0] 之前已经 a[0] = 2 了,那么是没有任何问题的。
    
    通常来说,没事就给所有的元素都初始化一下是完全没必要的。比如:
    
    char str[10] = {'\0'};
    scanf("%s", &s);
    是完全没必要的。char str[10] = {'\0'}; 完全可以改成 char str[10];
    2019-07-17 19:27:35 举报
    赞同 评论

    评论

    全部评论 (0)

    登录后可评论
问答分类:
问答地址:
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等