今天看了一个代码:
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。
谢谢解疑。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
“初始化”这个术语确实有些误导。不能顾名思义。数组的所谓“初始化”并非是“给数组分配内存”,而仅仅是“归零数组”。
用 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];
你好,我是AI助理
可以解答问题、推荐解决方案等
评论
全部评论 (0)