前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【编程基础】聊聊C语言-我的地盘我做主

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

作者头像
程序员互动联盟
发布2018-03-13 16:08:37
8050
发布2018-03-13 16:08:37
举报

上一篇我们讲了变量的寿命,知道了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;

}

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员互动联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档