C语言中变量为啥要初始化?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中变量为啥要初始化?相关的知识,希望对你有一定的参考价值。

最近在听郝斌老师的C语言课程,其中讲到变量为什么要初始化。他说变量对应在内存上有一块,然后不初始话的话那么得到的数据就是上一次使用这一块内存的数据。
但是我有点问题,我没有进行初始化,那么得到的数据和他视频中的数据是一样的啊??
说明这一段数据应该不是上一个程序残留的
那么这一段数据是什么意思呢?

这是视频地址,我说的可能不太明白,请高手到这里看看。。就知道我的意思了
http://www.sp299.com/NeiRong_WenZhang_498961_1307567_cn.html

C的局部变量一般是在栈上进行分配的。
栈使用的是RAM,掉电内容丢失,上电内容随机。
这里的随机,一般指其不能确定其内容一定是什么,而不是说其内容完全没有规律,与数学上的随机数没有什么关系。
举个例子,一个字节的RAM,8位有256种可能。数学上讲随机数,那么这个字节上电后应该是256种可能性中某一个。但计算机上不是这样,其上电后的内容一般来说就是0,但你不能保证它一定就是零,有很小的可能它的内容不是0,那么是多少呢?不知道!在程序处理上,你就要认为它的内容是随机的。

回到你的问题,你没有初始化,得到了一个确定的运行结果,为什么?两个可能,这个结果内容就是随机的,只不过结果恰好是这个值而已,但你不能保证下次运行结果,那么你就需要把它当随机值对待。另一个可能,你在不经意间执行了初始化,因为C编译器本身会链接一些初始化程序,这个牵涉到另一个话题,系统是怎么样进行初始化的。

结论,变量应该明确的进行初始化。如果系统不能确定你的变量初值是一个确定的值,那么就需要你自己来做初始化。
参考技术A 你不初始化赋初值的话,这个变量的具体值就是它占用内存空间所保存的值,
这个值有可能是上次程序残留的,还有一种情况,比如你定义的全局变量并没有初始化,
那么系统会自动初始化默认值 int就是0 字符串就是“”
static关键字声明的也是如此。
如果是局部变量就是很奇怪的值了,有一定随机性。
参考技术B 不初始化的话,得到的数据可能是随机的。追问

不是随机的!不管在哪弄都是一个定值,我在哪个电脑上输出,都是这一段数字i=-858993460

参考技术C 其实这种说法也对也不对 从理论来讲 一块内存是会继承它所在空间原来的值 但是往往编译器为了让程序员能够及时发现错误做了一些小小的调整 例如很多编译器 在我们定义了一个int型未初始化的变量之后 里面其实给定了默认值 例如 : -858993460 如果很奇怪这个数字是怎么来了 你可以试一下用十六进制的形式输出就了解了追问

怎么用十六进制形式输出?不懂。。。我在哪个电脑上输出,都是这一段数字i=-858993460

在C语言中,为啥定义变量的时候总是初始化为0呢?该怎么理解。

请问为什么很多时候都是初始化为0,这个0是一个整数型的数值还是一个概念东西。
搞不懂为什么是0而不是其他的?希望能举例说明。

谢谢下面各位的回复。

因为变量是可以变动的,定义一个变量不初始化时,变量会是一个随机数,进行计算了的时候,就会引用那个随机数进行计算,会有误差。 参考技术A 初始化时,会为变量开辟存储空间,然后把字节变成0000 0000(就相当于复位)。

存在这种可能,该地址以前已使用过,但系统并没有回收,擦除。就存在脏数据。本回答被提问者采纳
参考技术B 如果你不想去研究汇编代码,那就记住:静态存储区的变量初始化为0,堆栈区(也就是局部)的变量初始化值看编译器,VC++6.0里的编译器初始化时把函数要用的堆栈区全初始化为0xcccccccc,而堆区(动态开辟)的值是不定的。
给你一个简单的测试
#include <stdio.h>
#include <malloc.h>
int a;
int main()

int b;
int *c = (int *)malloc(sizeof(int));
static int d;
printf("%x\n%x\n%x\n%x\n", a,b,*c,d);
free(c);
return 0;
参考技术C 如果全局变量在定义时不初始化则初始值是0,如果局部变量在定义时不初始化则初始值是不确定的。 参考技术D 谁说总是初始化0的,全局变量和静态变量会,局部变量不一定,可恨的不同的编译所采用的方式可能也不一样,所以建议在使用任何变量前自己要初始化

以上是关于C语言中变量为啥要初始化?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中变量为啥要初始化?

C语言中使用变量为啥必须要初始化?

C++的变量为啥定义是要赋值?

C语言指针变量为啥要赋初值?

在C语言中,为啥定义变量的时候总是初始化为0呢?该怎么理解。

.为啥c语言里有的变量要赋初值,有的变量不用赋。