当前位置:  编程技术>c/c++/嵌入式

全局变量与局部变量在内存中的区别详细解析

    来源: 互联网  发布时间:2014-10-21

    本文导语:  一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一...

一、预备知识—程序的内存分配

一个由c/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack)— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域(.data),未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(.bss)。 - 程序结束后由系统释放。

4、文字常量区 —常量字符串就是放在这里的(.rodata)。 程序结束后由系统释放。

5、程序代码区—存放函数体的二进制代码(.text)。

二、例子程序
这是一个前辈写的,非常详细

代码如下:

//main.cpp
int a = 0;          // 全局初始化区
char *p1;           // 全局未初始化区
main()
{
  int b;            // 栈区
  char s[] = "abc"; // 栈区
  char *p2;         // 栈区
  char *p3 = "123456";     // "123456/0" 在常量区,p3在栈区
  static int c =0;         // 全局(静态)初始化区

  p1 = (char *)malloc(10);
  p2 = (char *)malloc(20); // 分配得来的10和20字节的区域就在堆区

  strcpy(p1, "123456");    // "123456/0" 放在常量区,编译器可能会将它
                              // 与p3所指向的"123456"优化成一个地方。
}

static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?

答:
1) 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

2) 从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。                  

3) static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件   

综上所述:

static全局变量与普通的全局变量有什么区别:

static全局变量只初使化一次,防止在其他文件单元中被引用;   

static局部变量和普通局部变量有什么区别:

static局部变量只被初始化一次,下一次依据上一次结果值;   

static函数与普通函数有什么区别:

static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

 ==============================================================
一个C语言变量分配的实际例子:
 
我们来看看在可执行文件中,变量们会被分配在哪些区里.这里以可执行文件为例子,可执行文件有固定的内存加载地址,符号(函数/变量的名字)将来在内存里的地址连接器是可以提前确定的。

源程序编译连接的结果是形成1堆汇编指令代码,大致分为.text .data .bss等几个节区(section)。对于.exe文件和.so文件,全局和静态变量都放在.data 或.bss段(gas把源文件从头到尾扫描1遍,才知道一个变量的全部情况:是否定义;类型;是否初始化。然后把初始化的变量在.data段里分配位置和 空间,把没初始化的变量在.bss段里分配位置和空间,没定义的变量分配在.undef段)。汇编指令代码里全局变量表现为一个内存地址(全局变量在目标 文件里是一个偏移值,加载进内存里是一个内存地址)。临时变量在汇编代码里变成ebp/esp+n,表现为一个堆栈地址,化为程序正文(.text)的一 部分。有些变量的最终内存地址在加载进内存之前还不能确定,需要加载进内存才可以计算出来.

全局变量 作用域是跨越多个源程序的。因此全局变量不能重名。静态变量作用域是位于单个源程序内。多个源程序可以有同名的全局静态变量。本例中,为了区分多个同名的静态变量,gcc 用 c444和c444.0 来加以区别。

代码如下:

[test@redhat]// more aaa.c
# include
int a111 = 0;              // 全局变量 已初始化
char *p111 = "654321";     // 全局指针变量 已经初始化
static int c444 = 9;       // 静态全局变量 已经初始化
static int c555;           // 静态全局变量 未初始化
main()
{
    int b222;              // 局部变量
    char s333[] = "abc";   // 局部变量
    char *p222;            // 局部变量
    char *p333 = "123456";    // 局部变量
    static int c444 =0;       // 已初始化静态局部变量,与前面静态全局变量重名
    p111 = (char *)malloc(10);
    p222 = (char *)malloc(20);
    strcpy(p111, "123456");
}

    
 
 

您可能感兴趣的文章:

  • 全局结构体变量和全局结构体指针变量
  • static全局变量与普通的全局变量的区别详细解析
  • 在一个进程中我定义了几个全局变量,然后我又fork了几个子进程,子进程中是否可以各自对全局变量进行修改,如果各子进程都对其进行修改,
  • 在JBUILDER中如何使用全局变量,最好举一个例子。我也不知道在哪里定义全局变量?
  • 动态库中的变量(全局和自动变量)在什么地方存储,内存在什么位置分配?
  • linux动态链接库里全局变量和静态变量会导致动态库不可重入吗?
  • Java中怎样定义全局变量???
  • PHP 超全局变量库 superGlobals
  • 网卡驱动使用全局变量
  • PHP static局部静态变量和全局静态变量总结
  • c++作用域运算符用法(全局变量和局部变量)
  • 多进程中的全局变量问题,多谢帮忙!!!!
  • linux内核怎么定义汇编全局变量及在c文件中使用这个变量?有关0。11下的字符回显
  • linux中大量的全局变量怎么体现结构化的程序设计?
  • 求解关于全局变量的问题
  • 条件编译可以使用全局变量吗?
  • 如何不通过全局变量和静态变量与模态对话框进行数据交换?
  • C# 全局变量的学习小结
  • 除了全局变量,线程还可以通过哪些方法向定时器传递数据?
  • jsp中怎样定义全局变量
  • const 全局变量 与 const 局部常量的差别?
  • 探讨:程序在内存中的分配(常量,局部变量,全局变量,程序代码)问题
  • 逻辑地址、物理地址、线性空间、全局段、局部段 问题请教,高手指教了!!!!在线等,高手指教了!!!在线等!!!!!!!!
  • C语言中全局数组和局部数组的问题
  • 深入探讨C语言中局部变量与全局变量在内存中的存放位置
  • c语言全局变量和局部变量问题及解决汇总
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 全局结构体变量和全局结构体指针变量 iis7站长之家
  • 关于java类的全局变量问题
  • 全局路径匹配 GPAMatching
  • asp.net读取本地与全局资料文件的代码
  • 全局唯一ID生成服务 snowflake
  • 如何使连接池成为全局的?
  • 请问,uboot的命令函数,能否调用全局变量
  • JQuery中使用Ajax赋值给全局变量失败异常的解决方法
  • 传说很难的一个问题--全局变量问题
  • 模块编程中对内核全局变量引用的问题
  • linux内核全局变量定义问题!
  • debian下用脚本设置 全局变量的问题
  • 建一个linux共享库(.so.x.x文件)里边包含类、全局变量,结构体等
  • QT下如何定义全局变量
  • 全局变量问题求助
  • JQuery中使用Ajax赋值给全局变量异常的解决方法
  • 全局脚本是何文件?
  • 一个简单的全局变量的问题
  • 如何用c实现生成一个类似windows下uuid的全局唯一串的算法
  • java的应用程序中如何定义一个全局变量,在程序的任何地方都可以修改使用?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3