c语言变量赋值,初始化

来源:互联网 发布:单级放大电路实验数据 编辑:程序博客网 时间:2024/05/16 05:59
数组变量为全局变量,或被部分初始化,均会出现这种情况。C语言中,变量在没有显式初始化时,区分变量类型,有如下几种情况:1 全局变量, 和静态局部变量,未初始化时值默认为0.无论是数组还是变量,都是如此。2 局部变量,初始值为随机值。

3 数组类局部变量,当被部分初始化时,未被初始化部分,值默认为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。

0 0
原创粉丝点击