全局变量和局部变量在内存中的区别

全局变量和局部变量在内存中的区别答 有区别 全局变量保存在内存的全局存储区中 占用静态的存储单元 局部变量保存在栈中 只有在所在函数被调用时才动态地为变量分配存储单元 该题目考查的知识点是变量的存储类型及性质 C 语言经过编译之后将内存分为以下几个区域 1 栈 stack 由编译器进行管理 自动分配和释放 存放函数调用过程中的各种参数 局部变量 返回值以及函数返回地址 操作方式类似数据结

答:有区别。全局变量保存在内存的全局存储区中,占用静态的存储单元;局部变量保存在栈中,只有在所在函数被调用时才动态地为变量分配存储单元。

该题目考查的知识点是变量的存储类型及性质。C语言经过编译之后将内存分为以下几个区域:

(1)栈(stack):由编译器进行管理,自动分配和释放,存放函数调用过程中的各种参数、局部变量、返回值以及函数返回地址。操作方式类似数据结构中的栈。

(2)堆(heap):用于程序动态申请分配和释放空间。C语言中的malloc和free,C++中的new和delete均是在堆中进行的。正常情况下,程序员申请的空间在使用结束后应该释放,若程序员没有释放空间,则程序结束时系统自动回收。注意:这里的“堆”并不是数据结构中的“堆”。

(3)全局(静态)存储区:分为DATA段和BSS段。DATA段(全局初始化区)存放初始化的全局变量和静态变量;BSS段(全局未初始化区)存放未初始化的全局变量和静态变量。程序运行结束时自动释放。其中BBS段在程序执行之前会被系统自动清0,所以未初始化的全局变量和静态变量在程序执行之前已经为0。

(4)文字常量区:存放常量字符串。程序结束后由系统释放。

(5)程序代码区:存放程序的二进制代码。

显然,C语言中的全局变量和局部变量在内存中是有区别的。C语言中的全局变量包括外部变量和静态变量,均是保存在全局存储区中,占用永久性的存储单元;局部变量,即自动变量,保存在栈中,只有在所在函数被调用时才由系统动态在栈中分配临时性的存储单元。

有兴趣的读者可以运行下面的程序,分析一下运行结果。

#include       #include         int k1 = 1; int k2; static int k3 = 2; static int k4; int main( ) { staticint m1=2, m2; inti=1; char*p; charstr[10] = "hello"; char*q = "hello"; p= (char *)malloc( 100 ); free(p); printf("栈区-变量地址 i:%p\n", &i); printf(" p:%p\n", &p); printf(" str:%p\n", str); printf(" q:%p\n", &q); printf("堆区地址-动态申请:%p\n", p); printf("全局外部有初值 k1:%p\n", &k1); printf(" 外部无初值 k2:%p\n", &k2); printf("静态外部有初值 k3:%p\n", &k3); printf(" 外静无初值 k4:%p\n", &k4); printf(" 内静态有初值 m1:%p\n", &m1); printf(" 内静态无初值 m2:%p\n", &m2); printf("文字常量地址 :%p, %s\n",q, q); printf("程序区地址 :%p\n",&main); return0; }       




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228547.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午6:46
下一篇 2026年3月16日 下午6:46


相关推荐

  • mysql spring 事务_Spring事务隔离级别与Mysql事务隔离级别

    mysql spring 事务_Spring事务隔离级别与Mysql事务隔离级别一 MySQL 事务隔离级别读未提交 该级别事务可以读取到其他未提交的事务 造成脏读 读已提交 能读取到其他提交的事务 可以避免脏读 但可造成不可重复读与幻读 可重复读 MySQL 默认事务隔离级别 可以解决不可重复读 但无法阻止新插入的记录造成后者可能会查到前者无法查出的数据 序列化 事务的最高隔离级别 所有事务串行执行 性能最差 二 Spring 事务隔离级别 Isolation Default Sp

    2026年3月26日
    3
  • [linux] linux 复制文件夹/文件到指定位置 cp -r和cp -r -d[通俗易懂]

    1.cp-r移动子目录和根目录到指定文件夹将test文件夹移动到video内!cp-r./test./video操作后存在./video/test2.cp-r-d移动所有子目录到指定文件夹将所有子目录移动到指定位置如structuring内存在a,b,c,三个文件夹./structuring/a./structuring/b./structuring/c!cp-r-d./structuring/*./则操作后存在./a./b./c…

    2022年4月13日
    96
  • 如何确定pip安装成功,如何确定pygame安装成功

    如何确定pip安装成功,如何确定pygame安装成功一、如何确定pip安装成功?方法:在终端窗口中,输入piplist,能看到版本信息。(前提是要先将pip加入到环境变量中)二、如何确定pygame安装成功?方法,在终端窗口中,输入python-mpygame.examples.aliens,如果安装成功,会弹出一个游戏画面。示例游戏画面:…

    2022年5月23日
    56
  • C#酒店管理系统_酒店管理系统免费

    C#酒店管理系统_酒店管理系统免费1.酒店管理系统概要c#实现的酒店管理系统,里面包含了数据库文件,简易酒店管理系统源码,采用WinFrom程序设计开发的酒店管理系统;应用到标准的三层技术,多个视图工具控件;功能介绍用户可根据自己的需求入住登记不同类型的房间,同时登记个人基本信息,管理员可通过对不同类型房间的管理及房间信息管理设置不同的类型房间进行增删改查,并对入住客户的信息及点退房信息查询,并改变房间的入住与退房或空房间的状态信息2.数据库设计由于数据库较多,所以暂时不放出来,下面我们看运行截图3.运行截图

    2026年3月5日
    4
  • 数仓分层设计

    数仓分层设计数仓分层设计

    2026年3月16日
    2
  • 用Java 写一个冒泡排序

    用Java 写一个冒泡排序冒泡排序几乎是个程序员都写得出来,但是面试的时候如何写一个逼格高的冒泡排序却不是每个人都能做到,下面提供一个参考代码:importjava.util.Comparator;/***排序器接口(策略模式:将算法封装到具有共同接口的独立的类中使得它们可以相互替换)*/publicinterfaceSorter{ /** *排序 *@paramlist待排序的数组 */ public<TextendsComparable<T>>voids

    2022年7月7日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号