这个问题很重要!实际上前面讲那么多,其中有一个很重要的目的就是为了讲这个知识点。所谓初始化就是“第一次赋值”的意思。我们先来看一个程序:

 
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. int i;
  5. printf("i = %d\n", i);
  6. return 0;
  7. }

这里i没有被赋值,只是定义了一个存储空间。这时输出这个空间的内容,你觉得输出的值会是多少?是一个任意值吗?可以通过编译、链接、执行看一下,如下图所示。


图1:显示一个警告

这时单击图 1 中圆圈标出的向上的箭头,就可以看到警告的原因,如下图所示。


图2:显示警告的原因

然后对着警告的那一行双击,在程序中就会标出是哪个地方发出警告,或者直接按 F4 键就可以直接在程序中标出警告的地方。如果是 error 报错的话,同样可以这么操作。

但需要注意的是:首先,图 2 中警告的原因只是软件自动检测出来的,不一定是真正警告的原因;其次,标示出来的警告位置也不一定是真正警告的位置。因为软件不可能百分之百的智能化,它只能推测。所以如果在标示出的位置找不到错误,那就往上几行或下几行看看。

现在来看一下它警告的内容是什么:

warning C4700: local variable 'i' used without having been initialized

warning 是警告;C4700 表示的是一个地址;local 是“本地的”,就是“局部的”意思。

我们看到警告的原因是,“局部变量 i 使用了,但是没有给它初始化”,也就是说未初始化就使用它了。我们先不管警告,直接链接、执行,看结果是什么(使用 VC++ 6.0):
i = -858993460

如果i的值是任意值的话,那么再单击一次“执行”显示的应该是另一个值。但事实上不管重新执行多少次,还是这个值,这个值是不变的。下面就来讨论一下原因。

前面讲过,int i;运行的结果是将变量 i 和内存中的某一个单元产生关联。然后变量 i 就代表那个内存单元了,要想操作该内存单元只需要通过变量i就可以了。

在上面程序中没有给这个内存单元赋值就把它给输出了,所以问题就出在这里。你只定义了变量 i,但是没有给它赋值并把它输出了。所以关键就是看看 i 里面放的到底是什么。

首先,内存条是一个硬件设备,硬件设备里面要么是 0 要么是 1。计算机肯定得通电,没有电就运行不起来,有电之后它就会通过各种二极管、三极管之类的元器件产生高低电平。

如果电压在某一个范围之上,就认为是 1,在某一个范围之下,就认为是 0。所以 1 就表示高电平,0 就表示低电平,即电压的高或低产生 1 或 0。这时候只有两种状态,要么是 1,要么是 0。所以说 i 里面存放的就是由 0 和 1 组成的代码,不可能里面什么都没有!因为计算机要工作肯定得有电,有电就不可能是空的,有电就会转化成 1 或 0 这样的高低电平。所以硬件上要么是 1 要么是 0,不可能既不是 1 也不是 0,什么都没有!计算机硬件没有那种状态,这也是为什么计算机只能识别二进制的原因。所以变量 i 所关联的那内存单元里面肯定是由 0 和 1 组成的代码。

这里 i 单元虽然没有给它赋值,但这个空间在之前可能被其他软件使用过。比如放电影的时候将电影中的某一部分数据放到了这个单元中。电影看完之后一关闭,这个单元空间就释放了,即操作系统就会回收该内存空间,以便分配给其他软件使用。

但需要注意的是,操作系统虽然回收了该内存空间,但它并不清空该内存空间中遗留下来的数据,这句话很重要。但这样的话就会出现一个问题:以前的软件如果使用过 i 这个空间的话,那么那些垃圾数据还在里面保留着,如果没有初始化,那么它里面就应该是一个随机的垃圾值。但是当我们多次执行的时候发现它不是一个随机的值,而是一个不变的值。这是为什么呢?这个值叫“填充数字”或叫“填充字”。

微软公司在设计 VC++ 这个软件的时候,在它内部添加了一些特殊的处理。即如果发现一个变量里面存放的是一个垃圾值,就认为没有给它赋初值,那么系统就会自动将一个很小的,如 –858993460 这个填充数字给放进去。所以我们看到的结果都是一个不变的值。

那么微软公司为什么要这么设计?首先放入填充数字一定有好处!由于放入填充数字肯定会导致程序运行速度变慢,因为内部要进行处理。所以如果没有好处的话微软公司肯定不会这样设计!

大家想想,如果之前使用i这个空间后遗留下来的数字是 5,那么输出 5 后,你可能以为 i 里面存放的是一个有效的数据。但如果是一个很小的数字,这个数字基本上是很少有人使用的,那么你一看就知道可能是没有初始化。所以这个数字就是提醒你变量没有初始化。

综上所述,任何一个变量在使用之前必须要先对它进行初始化。不初始化的话使用它就没有实际意义了。在实际编程中,习惯上在定义变量的时候就对它进行初始化,这是一个很好的编程习惯。

但是按照 C89 标准,变量的定义只能在程序或复合语句的开头。这样就会有一个问题:“很多在开头定义但到后面才会用到的变量,在定义的时候如何对它们进行初始化呢?”。此时习惯上将它们初始化为0,然后等后面真正用到它们的时候再重新赋值。当然,定义时不初始化也可以,等到后面知道该给它赋什么值的时候再给它赋值也行。但还是建议大家在定义时将它们初始化为 0,养成这个习惯。

本文转载:C语言变量初始化是必须的吗?不初始化会怎样?

C语言变量初始化是必须的吗?不初始化会怎样?相关推荐

  1. C++ 语言变量的定义、声明和初始化

    C++ 语言变量的定义.声明和初始化 1. 定义变量 每种变量都存储一种特定的数据,在定义了变量后,它可以存储的数据类型就是固定的.存储整数的变量,就不能存储小数. 1.1 命名变量 变量的名称可以是 ...

  2. C语言变量初始化作用,C语言变量初始化

    C语言变量初始化教程 如果是定义的 因此,在 C 语言中,一个很好的习惯就是在定义变量的同时,给变量初始化,也就是给变量一个默认值. C语言变量初始化详解 语法 type varname = valu ...

  3. C语言变量初始化是必须的

    这个问题很重要!实际上前面讲那么多,其中有一个很重要的目的就是为了讲这个知识点.所谓初始化就是"第一次赋值"的意思.我们先来看一个程序: #include <stdio.h& ...

  4. C语言-变量生存期及作用域

    目录 1 变量的生存期和作用域 2 默认初始化规则(C++11) 1 变量的生存期和作用域 变量的储存方式:动态储存(自动.寄存器).静态储存(静态和外部) 储存方式 名称 自动变量 anto 寄存器 ...

  5. 存储过程debug值not a variable_C语言变量的存储类别

    在程序中经常会使用到变量,在C程序中可以选择变量的不同存储形式,其存储类别分为静态存储和动态存储.可以通过存储类别修饰符来告诉编译器要处理什么样的类型变量,具体主要有自动(auto).静态(stati ...

  6. c ++一行给多个变量赋值_C语言变量

    变量是程序可操作的存储区的名称. 变量其实只不过是程序可操作的存储区的名称.C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上. 变量的 ...

  7. C/C++语言变量声明内存分配

    [cpp] view plaincopy <span style="font-family: Verdana, Arial, Helvetica, sans-serif; " ...

  8. C语言变量的类型和存储位置

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  9. c语言变量生存期,C语言变量的生命周期

    变量的存储期是指程序运行过程中,变量在内存中的生存期,可以理解为变量的寿命.C语言中变量的存储期有自动存储期和静态存储期两种. 一般情况下,变量的存储期和作用域是紧密相关的.在函数外面定义的全局变量都 ...

最新文章

  1. 编程语言性能实测,Go比Python更胜一筹?
  2. 莉莉丝最新大作《末日余晖》首曝CG,揭秘美术制作幕后
  3. 硅谷程序员佛系养生法:我不修bug, 谁修bug
  4. 双系统(win7+ubuntu)ubuntu磁盘空间不足时解决方法
  5. probability是什么意思_probability
  6. postman并发测试_PostMan接口压力测试
  7. C# Ftp创建文件夹
  8. Luogu3403: 跳楼机
  9. Open3d数据滤波和点云分割
  10. MySQL入门系列:查询简介(二) 过滤数据
  11. [Linux]基本体系结构
  12. 关于ES自定义script painless的问题
  13. 深入理解volatile关键字---缓存一致性原理
  14. Mysql 各个版本区别及官网下载
  15. 华为HCIE RS笔记-02分层
  16. 圣诞节海报做了吗?为你准备了圣诞素材
  17. 《共同利益经济学》让梯若尔 epub+mobi+azw3
  18. 全网最详细 Spring Cloud 入门总结
  19. 三子棋游戏实现(c语言)
  20. 将Hexo从一台电脑转移至另一台电脑

热门文章

  1. 如何做一个姿势正确的2B产品经理
  2. python+xlrd+echarts数据可视化demo
  3. Office资源汇 | Office 365 微助理功能介绍 4
  4. 华为离职副总裁徐家骏:透露年薪千万的工作感悟,太震撼了!
  5. Javaweb中利用kaptcha生成验证码
  6. ul 、ol li 继承原有样式的问题
  7. 【ssi】增删改查六操作小框架(八)
  8. 3COM小型办公室有线局域网方案
  9. linux7.5进单用户模式,linux进入单用户模式
  10. [pytorch ] (a) must be greater or equal to the number of dimensions (b)