文章目录

  • 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对栈,内存的使用情况相关推荐

  1. c语言中extern关键字_了解C语言中的extern关键字

    c语言中extern关键字 In this article, we'll take a look at understanding the extern keyword in C. 在本文中,我们将了 ...

  2. c语言关键字extern作用,C语言中extern关键字详解

    <C语言中extern关键字详解>由会员分享,可在线阅读,更多相关<C语言中extern关键字详解(5页珍藏版)>请在人人文库网上搜索. 1.C 语言中 extern 关键字详 ...

  3. c语言中extern变量,C语言中的Extern用法

    C语言中的Extern用法 (2010-07-28 12:50:39) 标签: 杂谈 分类: 技术 C语言中的Extern用法 网上有很多帖子问C语言中Extern的用法,而且回答的详细程度各尽不同. ...

  4. C语言中extern关键字的使用

    C语言中extern关键字的使用,直接上代码. file1.c文件 #include<stdio.h> extern long power(int); int A = 2; int mai ...

  5. C语言中extern的用法--转

    http://blog.sina.com.cn/s/blog_52deb9d50100ml6y.html 在C语言中,修饰符extern用在变量或者函数的声明前,用来说明"此变量/函数是在别 ...

  6. C语言中extern修饰符的用法

    在C语言中,修饰符extern用在变量或者函数的声明前,用来说明"此变量/函数是在别处定义的,要在此处引用". 0. extern修饰变量的声明.举例来说,如果文件a.c需要引用b ...

  7. C语言中extern用法详解

    在C语言中,修饰符extern用在变量或者函数的声明前,用来说明"此变量/函数是在别处定义的,要在此处引用".  1. extern修饰变量的声明. 举例来说,如果文件a.c需要引 ...

  8. c语言extern的作用6,C语言中extern用法详解

    本文基于VC6.0 编译器 首先文档结构如下: myextern.h和myextern.c中定义extern函数 main.c中定义main方法,调用extern函数 1.第一个尝试: myexter ...

  9. 【C 语言】内存四区原理 ( 栈内存属性增长方向 | 栈内存开口方向 | 代码示例 )

    文章目录 一.栈内存开口方向 二.栈内存开口方向代码示例 一.栈内存开口方向 栈内存的生长方向 : 先后定义两个变量 int a , b; 开口向上 : b 的地址 > a 的地址 , a 放在 ...

  10. 【C 语言】内存四区原理 ( 栈内存与堆内存对比示例 | 函数返回的堆内存指针 | 函数返回的栈内存指针 )

    文章目录 一.函数返回的堆内存指针 二.函数返回的栈内存指针 一.函数返回的堆内存指针 在 main 主函数中 , 调用 get_memory 子函数 , 返回 malloc 初始化的堆内存 , 可以 ...

最新文章

  1. 兼容PC和手机触摸代码
  2. C++常量指针this
  3. 重磅新书 | 《Android 全埋点解决方案》预售正式开启!
  4. vb.net2019- 对象 (Visual Basic)
  5. wp7技术类网站汇总
  6. 确定Java等价性的新时代?
  7. 浏览器兼容console对象的简要解决方案
  8. Linux网络协议栈:一个TCP链接的耗时
  9. CSS/HTML/JS实现图片轮播
  10. Idea查看Java类图和接口实现关系
  11. win10系统小键盘数字键不能用怎么办
  12. 渗透测试 面试笔试题
  13. 水贝风机远程控制app
  14. thinkphp构架
  15. 什么是Arduino?Arduino的起源与架构简述
  16. 用matlab画曲顶柱体费用数据,走过曲顶柱体——国家大剧院
  17. 一体化步进伺服电机在插件机中的应用
  18. 计算机网络知识汇总(超详细)
  19. 色选机和筛选机的区别?
  20. python 字典写入excel_Openpyxl – 从字典写入excel的行和列

热门文章

  1. ArcGIS 道路线数据处理与拓扑操作
  2. 题目:将一个正整数分解质因数
  3. TagSupport标签的应用
  4. android自定义ClockView
  5. 【React Native 安卓开发】----(View实战之仿携程)【第三篇】
  6. C++总结学习(一)
  7. 性能测试--jmeter的参数类型【5】
  8. 中limit怎末用_Nginx配置——关于limit_conn_zone和limit_conn
  9. node cluster 数据共享_深入理解Node.js 中的进程与线程
  10. php mysql 拖拉 报表_php+mysql 生成统计报表