c语言为什么整型变量未赋值是随机值,而二维数组未赋值是0

整型变量auot类型的未赋值应该是随机值,auto类型的二维数组中部分数组元素已赋值,未赋值部分为什么默认为0,而不是随机数。

1.在C语言中,“初始化”和“赋值”是两个不同的概念。楼主问题中应该是“初始化”而非“赋值”。
int a = 0; 在声明一个变量的时候指定变量的值,这叫做初始化;
int a; a = 2; 这叫做赋值。
2.auto变量处于运行时堆栈。它的特点:在调用一个函数的过程中,这个函数内部的auto变量才存在,当这个函数调用结束时,这些变量所占用的内存即被收回。如果多次调用一个函数,这个函数内部的auto变量在内存中的地址是不确定的。由于auto变量在内存中的地址不是一成不变的,所以在程序开始前,编译器无法确定它们的值,并不对它们进行初始化。
因此,auto变量未被初始化时,编译器也不知道你想要往这个变量里存什么,所以它的值是不确定的,毫无意义的,等着你在运行时给它进行赋值操作。
3.如果不对一个数组(非全局的、非静态的)进行初始化,这个和上面的变量未初始化一样,编译器不知道你要做什么,所以懒得浪费时间对它们进行初始化。
如果对一个数组进行部分初始化,形如:
int a[10] = {1, 2, 3};
未被初始化的部分a[3]~a[9]便会被编译器初始化为0。我的理解是,这是编译器认为你只关心数组a中前三个数的值,而后面的编译器为了让你省心就帮你初始化为0了,这时候编译器想“反正你都让我把前三个给填上了数,我也不怕麻烦了,后几个我给你填0吧”,于是编译器很大方地挥一挥衣袖把a[3]~a[9]填为0。
但是:
int a[10];
a[0] = 1;
a[1] = 2;
a[2] = 3;
这个时候a[3]~a[9]的值并不是0.因为这是运行时赋值,这个时候编译器已经下班了,所a[3]~a[9]中的值也是不确定的。
4.最后,再说一下全局变量和一个函数内部的静态局部变量,它们并不是存储在运行时堆栈,在程序运行过程中,它们的在内存中地址是确定的,所以编译器就把它们初始化为0。
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-04-30
数组变量为全局变量,或被部分初始化,均会出现这种情况。

C语言中,变量在没有显式初始化时,区分变量类型,有如下几种情况:
1 全局变量, 和静态局部变量,未初始化时值默认为0.无论是数组还是变量,都是如此。
2 局部变量,初始值为随机值。
3 数组类局部变量,当被部分初始化时,未被初始化部分,值默认为0。
第2个回答  2015-05-22
1、首先题目是错误的,问题应该是“初始化”而不是“赋值”。
2、其次整型变量和数组在初始化未给值的情况下都会是随机值,而不是你说的数组就是为0.
3、最后还有特殊情况那就是如果数组在初始化的时候有给了几个值,那么其他没有给值的元素都会被编译器置为0.
比如int a[5] = {1, 2};那么编译器会帮你把后面的三个元素也置为0,只有在这种情况下才是0,其他的情况都是随机值。
第3个回答  2012-03-11
整型变量未赋值时系统会默认上一次的值,而二维数组需要开辟新的内存空间,初始值一定为0的追问

整形变量未赋过值,上一次的值应该是什么呢?

追答

看你是否上次开辟过该内存,开辟过的就是上次的那个

第4个回答  2012-03-11
因为你把数组定义成静态的了 static 默认初始化为0变量没有定义成静态的
要不你把变量 也定义成静态的试试追问

数组是auto类型的,未定义成静态的。变量也是auto类型的。

追答

数组 不会是定义的全局变量了? 全局变量存储在静态存储区,会默认为0

相似回答