c语言变量赋值,初始化

数组变量为全局变量,或被部分初始化,均会出现这种情况。

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。

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值