关于静态变量和全局变量的初始化问题

时间:2022-02-10 21:21:17
各位,小弟初学C语言。有些东西不太懂,希望各位不吝赐教。问题如下:
1、在C语言中全局变量和静态变量的空间分配是在编译时进行的,我想问一下那他们的初始化时在什么时候进行的?也是在编译时,分配完空间后吗?
2、如果是在编译时,那对于静态变量,如果在某个函数中有这么两句:int a; int * p=&a;  对于第二句显然是定义了一个静态变量p并对其进行初始化。但问题是,这一过程如果是在编译时完成的,可编译时变量a还不存在,那p的初始化是如何完成的?

12 个解决方案

#1


变量的分配空间在定义时
变量有声明和定义之分

#2


全局变量声明之前加上static,就是静态全局变量。全局变量和静态全局变量都是静态存储的;在存储上无区别。区别在于他们的作用域;全局变量的作用域是整个源程序,当源程序有多个源文件组成时,全局变量在各个源程序文件都是有效的;而静态全局变量怎被限制了作用域,只在定义该变量的源文件内有用在同一程序的其他源文件不能使用!
还有静态全局变量只初始化一次,防止在其他源文件调用!而全局变量可以再其他源文件初始化!! 

#3


初始化的实际执行是在运行时。而不是编译。


第二个问题中,P的初始化是在代码执行到该语句,取a的实际内存地址。

#4


p不是静态变量。

#5


建义看一下c和指针,我记得全局变量是由链接器初始化的.也就是说在程序运行前就被初始化了.

#6


引用 2 楼 haitunxiaomo 的回复:
全局变量声明之前加上static,就是静态全局变量。全局变量和静态全局变量都是静态存储的;在存储上无区别。区别在于他们的作用域;全局变量的作用域是整个源程序,当源程序有多个源文件组成时,全局变量在各个源程序文件都是有效的;而静态全局变量怎被限制了作用域,只在定义该变量的源文件内有用在同一程序的其他源文件不能使用!
还有静态全局变量只初始化一次,防止在其他源文件调用!而全局变量可以再其他源文件初始……


正解

#7


引用楼主 cmd1020 的回复:
各位,小弟初学C语言。有些东西不太懂,希望各位不吝赐教。问题如下:
1、在C语言中全局变量和静态变量的空间分配是在编译时进行的,我想问一下那他们的初始化时在什么时候进行的?也是在编译时,分配完空间后吗?
2、如果是在编译时,那对于静态变量,如果在某个函数中有这么两句:int a; int * p=&a;  对于第二句显然是定义了一个静态变量p并对其进行初始化。但问题是,这一过程如果是在……


1、静态或全局变量是在程序运行时初始化的。编译如何初始化?又没有真实的空间
2、理解这个问题,需要区分编译时内存分配和运行时内存分配。
   因为静态区和全局区是固定地址空间,所以在编译时可以给全局变量分配固定地址[仅仅是地址,不是空间],直到运行时才会分配真实的内存空间。

不明白给你说个通俗易懂的:
编译时:你的BOSS给你说:“小X啊……好好努力,明年公司上市了,给你10%的股权……” [预分配]
运行时:第二年公司真的上市了,股权你已经拿到手了,这才是真实的。 [真实分配]

#8


引用 7 楼 xuwening 的回复:
引用楼主 cmd1020 的回复:
各位,小弟初学C语言。有些东西不太懂,希望各位不吝赐教。问题如下:
1、在C语言中全局变量和静态变量的空间分配是在编译时进行的,我想问一下那他们的初始化时在什么时候进行的?也是在编译时,分配完空间后吗?
2、如果是在编译时,那对于静态变量,如果在某个函数中有这么两句:int a; int * p=&a;  对于第二句显然是定义了一个静态变……


说的好!很形象 呵呵

#9


见2楼的解释。其实static就是全局变量地方化。

#10


建议看一下 谭浩强 的那本C语言的书, 函数的那一章, 你就会很明白了!
详细的讲了 局部变量,全局变量,静态变量, 以及他们在函数和文件之间的作用域问题!

#11


难得啊1!!继续努力!

#12


看看这个,或许有用
内存分配方式有三种:

(1)       从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

(2)       在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

(3)       从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

#1


变量的分配空间在定义时
变量有声明和定义之分

#2


全局变量声明之前加上static,就是静态全局变量。全局变量和静态全局变量都是静态存储的;在存储上无区别。区别在于他们的作用域;全局变量的作用域是整个源程序,当源程序有多个源文件组成时,全局变量在各个源程序文件都是有效的;而静态全局变量怎被限制了作用域,只在定义该变量的源文件内有用在同一程序的其他源文件不能使用!
还有静态全局变量只初始化一次,防止在其他源文件调用!而全局变量可以再其他源文件初始化!! 

#3


初始化的实际执行是在运行时。而不是编译。


第二个问题中,P的初始化是在代码执行到该语句,取a的实际内存地址。

#4


p不是静态变量。

#5


建义看一下c和指针,我记得全局变量是由链接器初始化的.也就是说在程序运行前就被初始化了.

#6


引用 2 楼 haitunxiaomo 的回复:
全局变量声明之前加上static,就是静态全局变量。全局变量和静态全局变量都是静态存储的;在存储上无区别。区别在于他们的作用域;全局变量的作用域是整个源程序,当源程序有多个源文件组成时,全局变量在各个源程序文件都是有效的;而静态全局变量怎被限制了作用域,只在定义该变量的源文件内有用在同一程序的其他源文件不能使用!
还有静态全局变量只初始化一次,防止在其他源文件调用!而全局变量可以再其他源文件初始……


正解

#7


引用楼主 cmd1020 的回复:
各位,小弟初学C语言。有些东西不太懂,希望各位不吝赐教。问题如下:
1、在C语言中全局变量和静态变量的空间分配是在编译时进行的,我想问一下那他们的初始化时在什么时候进行的?也是在编译时,分配完空间后吗?
2、如果是在编译时,那对于静态变量,如果在某个函数中有这么两句:int a; int * p=&a;  对于第二句显然是定义了一个静态变量p并对其进行初始化。但问题是,这一过程如果是在……


1、静态或全局变量是在程序运行时初始化的。编译如何初始化?又没有真实的空间
2、理解这个问题,需要区分编译时内存分配和运行时内存分配。
   因为静态区和全局区是固定地址空间,所以在编译时可以给全局变量分配固定地址[仅仅是地址,不是空间],直到运行时才会分配真实的内存空间。

不明白给你说个通俗易懂的:
编译时:你的BOSS给你说:“小X啊……好好努力,明年公司上市了,给你10%的股权……” [预分配]
运行时:第二年公司真的上市了,股权你已经拿到手了,这才是真实的。 [真实分配]

#8


引用 7 楼 xuwening 的回复:
引用楼主 cmd1020 的回复:
各位,小弟初学C语言。有些东西不太懂,希望各位不吝赐教。问题如下:
1、在C语言中全局变量和静态变量的空间分配是在编译时进行的,我想问一下那他们的初始化时在什么时候进行的?也是在编译时,分配完空间后吗?
2、如果是在编译时,那对于静态变量,如果在某个函数中有这么两句:int a; int * p=&a;  对于第二句显然是定义了一个静态变……


说的好!很形象 呵呵

#9


见2楼的解释。其实static就是全局变量地方化。

#10


建议看一下 谭浩强 的那本C语言的书, 函数的那一章, 你就会很明白了!
详细的讲了 局部变量,全局变量,静态变量, 以及他们在函数和文件之间的作用域问题!

#11


难得啊1!!继续努力!

#12


看看这个,或许有用
内存分配方式有三种:

(1)       从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

(2)       在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

(3)       从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。