C++中变量自动初始化的问题

C++中有一些变量在如果没有赋初值会被编译器自动赋值为0,但有的变量又不会这样,而得到一个随机数,下面具体讨论一下:

首先看一下C++中的几个存储区:
1、栈区:由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。    
2、堆区:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。    
3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放    
4、常量区:常量字符串就是放在这里的。 程序结束后由系统释放    
5、程序代码区:存放函数体的二进制代码。

在上述的几个存储区域中,如果定义在全局区的变量没有被用户初始化的话,编译器会自动将其初始化为0。

这里要非常注意定义两个字而不是声明。

再来看一下定义和声明的区别:从编译原理上来说,声明是仅仅告诉编译器,有个某类型的变量会被使用,但是编译器并不会为它分配任何内存。而定义就是分配了内存。既然声明都不分配内存,所以自然也不可能被编译器自动初始化为0了。

结论:一些全局变量(不管用没用static修饰)或者是使用static中修饰的局部变量在定义的时候都会被编译器自动初始化为0,而在声明的时候任何变量都不会被编译器自动初始化。如static int num;如果放在函数中的任何位置都会被隐式的初始化为0,但是如果是在类的声明中这样写就不会有值。

时间: 2024-10-15 21:30:24

C++中变量自动初始化的问题的相关文章

C++初始化中变量的初始化方法

之前学习C++的时候没有记得做好笔记,现在重新补做!!!!! 1.普通变量的初始化 因为C语言是C++子集,自然包含了所有C语言的特性,所以在C语言的基础之上又新增了属于C++自己特性的初始化方式,以C++11标准来说明: (1)int a = 10;           // 这种是最熟悉的方式,是从C中继承过来的 (2)int a (10);             // 使用一个小括号将初始化的数值括起来,a与小括号之间有无空格都行 (3)int a {10};            //

C++类中变量定义初始化总结

1.类成员不可以在定义时初始化 2.const类型的成员必须在初始化化列表进行初始化:一般变量在在初始化列表中初始化的顺序决定于定义的顺序 #include<iostream> using namespace std; class A { private: int n1; int n2; public: A():n2(0),n1(n2+2){} void Print(){ cout << "n1:" << n1 << ", n2

.NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器

开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也不禁地对编译器内部到底为我们做了哪些事儿而感到好奇?于是,我们就借助反编译神器,去看看编译器到底做了啥事!其实本篇中很多都不算新语法,对于很多人来说可能都是接触了很久了,这里主要是针对.NET的老版本来说,是一个“相对”的新语法. /* 新语法索引 */ 1.自动属性 Auto-Implemente

C++中不同变量的初始化规则

当定义没有初始化式的变量(如int i;)时,系统有可能会为我们进行隐式的初始化.至于系统是否帮我们隐式初始化变量,以及为变量赋予一个怎样的初始值,这要取决于该变量的类型以及我们在何处定义的该变量. 1]内置类型变量的初始化     内置变量是否自动初始化,取决于该变量定义的位置.     ①在全局范围内的内置类型变量均被编译器自动初始化为0. #include<iostream> using namespace std; //全局范围内的部分内部变量 int gi; //被自动初始化为0 f

关于C#中的变量的初始化问题浅谈

C#变量初始化是C#强调安全性的另一个例子.简单地说,C#编译器需要用某个初始值对变量进行初始化,之后才能在操作中引用该变量.大多数现代编译器把没有初始化标记为警告,但C#编译器把它当作错误来看待.这就可以防止我们无意中从其他程序遗留下来的内存中获取垃圾值. C#变量初始化的操作中有两个方法可确保变量在使用前进行了初始化: ◆变量是类或结构中的字段,如果没有显式初始化,创建这些变量时,其值就默认是0(类和结构在后面讨论). ◆方法的局部变量必须在代码中显式初始化,之后才能在语句中使用它们的值.此

C/C++变量的自动初始化——重要

对于内置变量的自动初始化 代码1: #include<stdio.h> #define CONST 100 int *p1; int a[2]; int b; static int c; main() { int d; static int e; int f[2]; int *p2; printf("CONST=%d\n",CONST); printf("a[0]=%d\n",a[0]); //printf("*p1=%d\n",*p

关于C#中编译器保证变量必须初始化规则猜想

现在两种情况: 第一种情况: using System; namespace Wrox { public class Program { static void Main(string[] args) { int index; if(true) { index = 100; } Console.WriteLine(index); Console.ReadKey(); } } } 第二种情况: using System; namespace Wrox { public class Program

C++中 auto自动变量,命名空间,using作用以及作用域

 1.auto关键字的用途 A:自动变量,可以自动获取类型,输出,类似泛型 B:自动变量,可以实现自动循环一维数组 C:自动循环的时候,对应的必须是常量 2.auto自动变量,自动匹配类型的案例如下: 3.通过auto关键字自动循环一维数组的案例 #include<iostream> #include<stdlib.h> #include<iomanip> usingnamespacestd; voidmain() { //定义一维数组,下面的数组名是一个指针常量

Python中,如何初始化不同的变量类型为空值

参考文章  Python中,如何初始化不同的变量类型为空值 常见的数字,字符,很简单,不多解释. 列表List的其值是[x,y,z]的形式 字典Dictionary的值是{x:a, y:b, z:c}的形式 元组Tuple的值是(a,b,c)的形式 所以,这些数据类型的变量,初始化为空值分别是: 数值 digital_value = 0 字符串 str_value = "" 或 str_value = ” 列表 list_value = [] 字典 ditc_value = {} 元组