C语言中extern 全局变量,二进制文件与内存,static,const对栈,内存的使用情况
文章目录
- extern
- 二进制文件与内存
- 静态内存
- 静态变量
- 分配空间
- 未初始化的变量,什么时候初始化。
- C语言不支持静态变量的动态初始化,C++ 支持
- static
- const
- 参考
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。
参考
https://wenku.baidu.com/view/496c452601020740be1e650e52ea551810a6c924.html
C语言中extern 全局变量,二进制文件与内存,static,const对栈,内存的使用情况相关推荐
- c语言中extern关键字_了解C语言中的extern关键字
c语言中extern关键字 In this article, we'll take a look at understanding the extern keyword in C. 在本文中,我们将了 ...
- c语言关键字extern作用,C语言中extern关键字详解
<C语言中extern关键字详解>由会员分享,可在线阅读,更多相关<C语言中extern关键字详解(5页珍藏版)>请在人人文库网上搜索. 1.C 语言中 extern 关键字详 ...
- c语言中extern变量,C语言中的Extern用法
C语言中的Extern用法 (2010-07-28 12:50:39) 标签: 杂谈 分类: 技术 C语言中的Extern用法 网上有很多帖子问C语言中Extern的用法,而且回答的详细程度各尽不同. ...
- C语言中extern关键字的使用
C语言中extern关键字的使用,直接上代码. file1.c文件 #include<stdio.h> extern long power(int); int A = 2; int mai ...
- C语言中extern的用法--转
http://blog.sina.com.cn/s/blog_52deb9d50100ml6y.html 在C语言中,修饰符extern用在变量或者函数的声明前,用来说明"此变量/函数是在别 ...
- C语言中extern修饰符的用法
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明"此变量/函数是在别处定义的,要在此处引用". 0. extern修饰变量的声明.举例来说,如果文件a.c需要引用b ...
- C语言中extern用法详解
在C语言中,修饰符extern用在变量或者函数的声明前,用来说明"此变量/函数是在别处定义的,要在此处引用". 1. extern修饰变量的声明. 举例来说,如果文件a.c需要引 ...
- c语言extern的作用6,C语言中extern用法详解
本文基于VC6.0 编译器 首先文档结构如下: myextern.h和myextern.c中定义extern函数 main.c中定义main方法,调用extern函数 1.第一个尝试: myexter ...
- 【C 语言】内存四区原理 ( 栈内存属性增长方向 | 栈内存开口方向 | 代码示例 )
文章目录 一.栈内存开口方向 二.栈内存开口方向代码示例 一.栈内存开口方向 栈内存的生长方向 : 先后定义两个变量 int a , b; 开口向上 : b 的地址 > a 的地址 , a 放在 ...
- 【C 语言】内存四区原理 ( 栈内存与堆内存对比示例 | 函数返回的堆内存指针 | 函数返回的栈内存指针 )
文章目录 一.函数返回的堆内存指针 二.函数返回的栈内存指针 一.函数返回的堆内存指针 在 main 主函数中 , 调用 get_memory 子函数 , 返回 malloc 初始化的堆内存 , 可以 ...
最新文章
- 兼容PC和手机触摸代码
- C++常量指针this
- 重磅新书 | 《Android 全埋点解决方案》预售正式开启!
- vb.net2019- 对象 (Visual Basic)
- wp7技术类网站汇总
- 确定Java等价性的新时代?
- 浏览器兼容console对象的简要解决方案
- Linux网络协议栈:一个TCP链接的耗时
- CSS/HTML/JS实现图片轮播
- Idea查看Java类图和接口实现关系
- win10系统小键盘数字键不能用怎么办
- 渗透测试 面试笔试题
- 水贝风机远程控制app
- thinkphp构架
- 什么是Arduino?Arduino的起源与架构简述
- 用matlab画曲顶柱体费用数据,走过曲顶柱体——国家大剧院
- 一体化步进伺服电机在插件机中的应用
- 计算机网络知识汇总(超详细)
- 色选机和筛选机的区别?
- python 字典写入excel_Openpyxl – 从字典写入excel的行和列
热门文章
- ArcGIS 道路线数据处理与拓扑操作
- 题目:将一个正整数分解质因数
- TagSupport标签的应用
- android自定义ClockView
- 【React Native 安卓开发】----(View实战之仿携程)【第三篇】
- C++总结学习(一)
- 性能测试--jmeter的参数类型【5】
- 中limit怎末用_Nginx配置——关于limit_conn_zone和limit_conn
- node cluster 数据共享_深入理解Node.js 中的进程与线程
- php mysql 拖拉 报表_php+mysql 生成统计报表