修饰符与内存布局

1.auto 类型.
1)只能用于修饰局部变量,表示该变量存储在栈上 stack.
2)默认的局部变量,就是aotu类型,所以通常将其省略.

2.register.
只能修饰局部变量,将内存重的变量升级到cpu寄存器中存储,这样访问速度会很快。存储cpu的变量,速度快但是数量有限,通常用来优化。用于频繁使用的变量,一般不用。
必须要注意的是,使用register修饰的变量不能去地址值,因为该变量储存在寄存器,是没有地址的。

3.extern
用来修饰变量或函数,extern可以置于变量或者函数前,以表示变量或者函数定义在别的文件中,提示编译器遇到此变量或函数时在其他模块中寻找其定义。
注意:因为声明函数没有函数体(还有以分号结尾),所以在声明函数的时候可以将extern省略掉。但一般是在头文件(.h文件)声明的时候才省略掉extern,如果是在其他c文件声明则建议加上extern。
(1)不要在头文件定义全局变量,全局变量需要定义在.c文件,头文件使用extern进行声明即可。
(2)文件声明的函数可以不加extern,且也不要在头文件定义。

4.static
主要有2种用法:
(1)限定作用域,比如
修饰全局变量-全局静态变量;
修饰函数-静态函数。
(2)保持变量内容持久化;
修饰局部变量-局部静态变量。

*修饰全局变量-全局静态变量
在全局变量前加上关键字static,全局变量就定义成一个全局静态变量(限定作用域)。
全局静态变量作用域被限制,旨在定义它的文件之内可见,准确的说是从定义之初开始,到文件结尾。
在函数返回类型前加关键字ststic,函数就成静态函数。静态函数只是在定义它的文件当中可见,不能被其他文件所用。

使用原则:(1)某一个函数不想被其他模块所引用,则使用static进型修饰;
(2)不同的文件可能函数名有相同,此时使用static进行修饰可以解决重名的问题。

*修饰局部变量-局部静态变量
在局部变量之前加上关键字static,局部变量就成为一个局部静态变量。
作用域:作用域任为局部作用域,当定义它的函数或者语句块结束的时候,作用域结束。但是当局部变量静态变量离开作用域后,并没有销毁,而是任然驻留在内存当中,该函数再次被调用,其值和前次调用退出时一样。
局部变量是定义在栈上,函数退出后变量就销毁。
局部静态变量是定义在静态区,其在程序开始运行时就已经在内存里面。

5.内存布局
c语言程序在内存执行时主要分为四个区:(1)代码区,(2)静态区,(3)堆区,(4)栈区(大部分情况下,我们只需要理解这四个区就可以了)。

内存布局

代码区:
代码区(code area),通常是指用来存放程序执行代码的一块内存区域。这部分的区域大小在程序执行前就已经确定。并且内存区域通常属于只读。在代码段中,也有可能包含一些只读的常量变量,例如字符串常量等。

静态区:
静态区存储的内容是程序加载到内存的时候就确定,程序退出的时候从内存消失。
所有的全局变量/全局静态变量和局部静态变量都存储到静态区,在程序运行期间都占用生命周期;静态区存储的变量生命周期从程序运行时开始,直到程序结束。

栈区:
栈stack是一种先进后出的结构,由编译器自动分配释放内存,存放函数的参数值,局部变量的值等。

(1)函数调用先进后出;
(2)函数入栈是由高地址往低地址变化;
(3)函数调用入栈占用的空间和出栈时要释放的空间是相等的。
(4)函数调用栈的深度由函数栈上分配的空间决定,如果分配较大的数组则栈会比较深;
(5)栈上不能分配太大的数组(比如2M去试试),否则栈会溢出,导致程序崩溃。
(6)栈变量的生命周期,它是在函数执行的时候开始,直到函数调用结束时栈退出(生命周期和作用域是没有关系的)。

堆区:
也叫动态内存分配区域,即由程序员自己负责分配和释放内存的区域。
和栈区的区别:
(1)栈区分配的空间不能太大,一般不能超过2M;堆区可以分配较大的内存空间,只要内存足够大(分配100M/1000M都没有问题)。
(2)栈区的变量空间由系统自动分配和释放;堆区要程序员自己申请(malloc)和释放(free),不主动释放会引起内存泄露。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值