C语言变量的初始化

至于C语言变量是否用初始化的题材。以前西北工业大学之C语言老师说之是,需要初始化,如果无初始化就采用以来,变量的价值是以前遗留在内存中之,是无确定的。自己其实测试,在微软的vs2008或2010环境下,如果C变量(特别是指针)不初始化就动的话,会报错:使用了没有初始化的变量或者指针。

  1. 全局变量的初始化

当Linux环境下,不报错。如果急需自己之代码严谨的话,是要被每个变量进行初始化的。

     对于不同编译单位的全局变量,其初始化的次第没有另外的包,因此对不同编译单位里之全局变量,在它们的初始化顺序之间建立因都是匪明智之。

     此外也从未办法捕捉到全局变量初始化抛出的老大,一般的话要减小全局变量的行使,特别是限量那些要求复杂初始化的全局变量。
     1,尽量不用全局变量
     2,用静态变量,通过访问器进行走访

    例如:全局变量
    int a = 5;
    int b = a;
    如果a,和b定义在与一个文本里,那不要紧问题,结果b等于5.
   
如果a和b定义在不同文件里,就无克保证b也等于5,也就是说不可知保证a先初始化.

     事实上,除了以跟一个文件定义的全局对象的初始化是据定义软序来拓展的外侧,其他全局或静态变量之间的初始化次序没有外保障。解决这种问题之办法是无直接运用全局变量,而改用一个封装函数来拜会,例如
int get_a()
{
static int a = 5;
return a;
}
int get_b()
{
static int b = get_a();
return b;
}   
    
   
这样的话,无论get_a和get_b是否定义在与一个文书中,get_b总是能够回到正确的结果,原因在于,函数内部的静态变量是在率先次于访的时段来初始化。

   
任何时刻,如果在不同的让编译单元中定义了”非局部静态对象”,并且这些目标的不错行为负让她叫初始化的某某平等特定顺序,就见面出问题.你绝对无法控制不同为编译单元中非局部静态对象的初始化顺序.对于函数中的静态对象(即”局部”静态对象)它们在函数调用过程遭到首碰到对象的概念时于初始化..  

    留神:千万不要写来与编译顺序相关的次来。

有关全局变量的初始化,C语言和C++是发分之。      
   于C语言中,只能用常数对全局变量进行初始化,否则编译器会报错。       
   以C++中,如果以一个文件被定义了int a = 5;要于另一个文本被定义int b =
a;的话,前面必须对a进行宣示:extern int
a;否则编译不通过.、即使是这么,int b =
a;这句话也是分开点儿步进行的:在编译阶段,编译器把b当作是未初始化数据如果以她开始化为0;在履等,在main被实践前发出一个大局对象的结构过程,
int b = a;被看成是int型对象b的拷贝初始化构造来实施。    
   其实,准确地说,在C++中全局对象、变量的初始化是单身的,如果未是象int
a = 5;这样的早已初始化数据,那么就是是象b这样的未初始化数据。    
  
而C++中全局对象、变量的构造函数调用顺序是同声明起一定关系之,即在和一个文书被优先声明的先调用。对于不同文件被的大局对象、变量,它们的构造函数调用顺序是免定义之,取决于具体的编译器。


另:

   c语言中 支持 结构体间的一体化附值。

 


发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图