【编程基础】聊聊C语言-我的地盘我做主

上一篇我们讲了变量的寿命,知道了C语言的变量是有生命周期的。到了一定的时机它们所占用的内存就会被释放。接下来我们讲讲这些变量都存储在哪些地盘上以及它们各自的势力范围。

记得当年小编在看古惑仔时,每个帮派都有自己的名号地盘,洪兴、东星、三联帮、山口组这些名字估计跟小编一个年代的人都还记得。而在C语言中我们也为变量划分好了名号地盘也为它们划分好了势力范围。

程序中的地盘

代码区:存放我们程序代码的地方它是可共享的,并且是只读的。

数据区:存放已初始化的全局变量、静态变量(全局和局部)、常量数据。

BBS区:存放的是未初始化的全局变量和静态变量的。

栈区:由系统自动分配释放,存放函数的参数值、局部变量和返回值的地方,在程序运行过程中实时分配和释放,栈区由操作系统自动管理,无须我们管理。

堆区:堆是由malloc()或calloc()函数分配的内存块,使用free()函数来释放内存,堆的申请释放由我们控制,如果我们不小心就会产生内存泄漏。

C语言中的四种名号

auto:只能用来标识局部变量的存储类型,对于局部变量,auto是默认的存储类型,不需要显示的指定,auto标识的变量存储在栈区中,它的势力范围为一对{}内。

register:声明为register的变量系统会为其选择一个寄存器进行存储,它常驻在CPU的寄存器中,所以register变量将在很大程度上提高效率,因为它省去了由内存调入到寄存器过程中的好几个指令周期,它的势力范围也为一对{}内。

static:用来声明静态类型的变量,无论是全局的还是局部的,静态类型的变量都存储在数据区中,其生命周期为整个程序。如果是静态局部变量,其势力范围为一对{}内,如果是静态全局变量,其势力范围为当前文件。静态变量如果没有被初始化,则自动初始化为0。静态变量只能够初始化一次。

extern:用来声明在当前文件中引用但在当前项目中的其它文件中定义的全局变量。如果全局变量未被初始化,则编译时自动初始化为0,存在BBS区中;如果已经初始化,那么存在数据区中。全局变量,不管是否被初始化,其生命周期都是整个程序运行过程中。通常在当前文件中使用extern来声明其它文件中定义的全局变量时,就不会再为其分配内存空间。

这篇聊聊C语言-我的地盘我做主,就讲到这里。大家有什么不明白的或者有什么意见可以关注下面的微信公众号,我们一起在线讨论。下面是针对这篇小编为留的练习题,请写出每个变量的存储区域及程序的打印结果,答案会在下一篇公布:

#include<stdio.h>

int a=1;

int b;

int main(void)

{

auto int a=2;

static int c=2;

{

int c=3;

int b=4;

}

printf("a=%d b=%d c=%d\n",a,b,c);

return0;

}

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-07-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

4525
来自专栏C#

DotNet加密方式解析--非对称加密

    新年新气象,也希望新年可以挣大钱。不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬。(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...)...

6728
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

5618
来自专栏Golang语言社区

【Golang语言社区】GO1.9 map并发安全测试

var m sync.Map //全局 func maintest() { // 第一个 YongHuomap := make(map[st...

6438
来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

3502
来自专栏杨龙飞前端

scrollto 到指定位置

3435
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

1.1K8
来自专栏我和未来有约会

Kit 3D 更新

Kit3D is a 3D graphics engine written for Microsoft Silverlight. Kit3D was inita...

3356
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.6K7
来自专栏魂祭心

原 canvas绘制clock

5944

扫码关注云+社区