600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > C语言中extern 全局变量 二进制文件与内存 static const对栈 内存的使用情况

C语言中extern 全局变量 二进制文件与内存 static const对栈 内存的使用情况

时间:2020-04-15 17:04:22

相关推荐

C语言中extern 全局变量 二进制文件与内存 static const对栈 内存的使用情况

文章目录

extern二进制文件与内存静态内存静态变量分配空间未初始化的变量,什么时候初始化。C语言不支持静态变量的动态初始化,C++ 支持staticconst参考

extern

对于全局变量,可以使用extern 在其他文件中使用全局变量。推荐的用法

1、在 .c 文件中定义一个全局变量,例如,char array[1010241024];

2、在 .h 文件中使用 extern char array;

3、其他文件使用时,直接 #include xxx.h ,然后使用extern char array;

这个是比较推荐的用法

最不推荐:在xxx.h 中定义全部变量,头文件被引用后,容易造成重复定义。

另外,头文件之间最好松耦合,函数单独定义,one in,one out。不要交叉引用,造成逻辑不清晰,增加错误可能性。

另外 全局变量定义后,初始化了,gcc main.cpp -o main编译后,全局变量将会保存在二进制程序文件.Data 段中。

二进制文件与内存

二进制文件有两个重要的段section:代码段与数据段

数据分为段:.Data 和 .bss段,

.Bss段存放未初始化的全局变量和局部静态变量,初始化为0的也在这个段,bss段不占用bin文件空间。.Data 段存放初始化的全局变量和初始化的局部静态变量

注意:普通局部变量保存在堆栈中

代码段:

.Rodata 存放字符常量.Text 段存放代码

常量分为普通常量(比如2,3.0,#define PI 3.14)和文字常量(比如“hello world”)。

普通常量经编译后成为二进制程序代码的一部分;

文字常量保存在文字常量区,这部分内存中的内容不允许修改。

静态内存

数据段 .Bss 和 .Data 为静态内存,不使用栈内存。

静态变量

存储在静态内存的变量,即使没有每static修饰。

注意:static 在不同位置有不同含义,待会讲。

静态内存在程序运行前被创建,分为:已经初始化和未初始化

初始化的:static 的局部变量;初始化的全局变量;static局部变量默认就是zero-init,即使没有显式的初始化,也会是zero;全局变量赋值了就算是初始化,会在编译阶段初始化放在静态内存的.data段。

未初始化的:未初始化的全局变量和局部静态变量,初始化为0的也在这个段。存放在.bss段,.bss不占用bin文件空间。

.data 在编译阶段已经完成了创建+初始化;.bss 在编译阶段完成了创建,为初始化,初始化的时间未知,空有其名。

分配空间

程序运行前,.data 直接被加载到映射到内存中,非栈空间。(在运行后,全局变量被调用了,才会被linux监控器计算?这一点我还不清楚)

.bss 在二进制的section header table定义了,但是只有在程序运行后。(到底什么时候分配内存,我理解这和操作系统不同也会不同,linux可能是在调用的时候才会想着取给他分配空间)。

未初始化的变量,什么时候初始化。

进程载入时初始化。

C语言不支持静态变量的动态初始化,C++ 支持

C语言中静态变量,创建在编译的时候完成,初始后都是在程序运行前完成的。

static

1、对全局变量使用static修饰,该变量只能在本文件内使用。

2、staic 对局部变量修饰,该变量认为时静态内存里面的变量

const

在c语言中

1、const局部变量(局部变量就是在函数中定义的一个const变量,)存储在栈中,代码块结束时释放。static const 变量 属于静态内存,在.data段,占用bin文件空间。

2、可以通过指针对const局部变量进行修改

3、不可以对const全局变量进行修改。因为const全局变量是存储在只读数据段

4、c中const默认为外部连接

C++中,

c中const默认为外部连接,c++中const默认为内部连接.当c语言两个文件中都有const int a的时候,编译器会报重定义的错误。而在c++中,则不会,因为c++中的const默认是内部连接的。如果想让c++中的const具有外部连接,必须显示声明为: extern const int a = 10。

参考

/view/496c452601020740be1e650e52ea551810a6c924.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。