【编程基础】聊聊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 条评论
登录 后参与评论

相关文章

来自专栏MyBlog

Effective Java 读书笔记(7)避免finalizer

对于Finalizers他们的使用可能会造成错误的产生,糟糕的性能以及移植性的问题,当然Finalizers有着一些有用的优点,我们会在后续介绍这些,但是作为首...

732
来自专栏Ryan Miao

redis学习之二from github

大概敲了一遍基本命令,熟悉了redis的存储方式。现在开始进一步系统的学习。学习教程目前计划有三个,一个是github上的https://github.com/...

2696
来自专栏架构说

缓存策略之LRU实现及分析

LRU定义 Cache的容量有限,因此当Cache的容量用完后,而又有新的内容需要添加进来时, 就需要挑选并舍弃原有的部分内容,从而腾出空间...

29910
来自专栏程序人生

Promise: 给我一个承诺,我还你一个承诺

处理concurrent programming,除了threading/multi-processing外,各家语言都有自己的绝活:erlang/elixir...

2664
来自专栏青玉伏案

算法与数据结构(二) 栈与队列的线性和链式表示(Swift版)

数据结构中的栈与队列还是经常使用的,栈与队列其实就是线性表的一种应用。因为线性队列分为顺序存储和链式存储,所以栈可以分为链栈和顺序栈,队列也可分为顺序队列和链队...

16910
来自专栏程序员宝库

48 条高效率的 PHP 优化写法

能用PHP内部字符串操作函数的情况下,尽量用他们,不要用正则表达式, 因为其效率高于正则。

1264
来自专栏微信公众号:Java团长

Java面试题:百度前200页都在这里了

transient变量有什么特点 super什么时候使用 public static void 写成 static public void会怎样 说明一下pub...

692
来自专栏决胜机器学习

Redis专题(十)——Redis存储Session

Redis专题(十) ——Redis存储session (原创内容,转载请注明来源,谢谢) 一、概述 PHP默认是将session存于服务器...

3275
来自专栏java技术学习之道

百度"Java面试题"前200页都在这里了

832
来自专栏Crossin的编程教室

Python 中的 time 模块

写代码时,常常会遇到处理时间和日期的问题。在 Python 中,与时间处理最相关的模块是 time 和 datetime。今天我们介绍下 time 模块的常用功...

2608

扫描关注云+社区