C语言深入讲解栈与堆和静态存储区的使用_第1页
C语言深入讲解栈与堆和静态存储区的使用_第2页
C语言深入讲解栈与堆和静态存储区的使用_第3页
C语言深入讲解栈与堆和静态存储区的使用_第4页
C语言深入讲解栈与堆和静态存储区的使用_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C语言深入讲解栈与堆和静态存储区的使用目录一、程序中的栈二、函数的调用过程三、函数调用的栈变化四、函数调用栈上的数据五、程序中的堆六、程序中的静态存储区七、小结

一、程序中的栈

栈是现代计算机程序里最为重要的概念之一栈在程序中用于维护函数调用上下文函数中的参数和局部变量存储在栈上

栈保存了一个函数调用所需的维护信息

参数返回地址局部变量调用上下文

二、函数的调用过程

每次函数调用都对应着一个栈上的活动记录

调用函数的活动记录位于栈的中部被调函数的活动记录位于栈的顶部

三、函数调用的栈变化

从main()开始运行

main()调用f()

当从f()调用中返回main()

四、函数调用栈上的数据

函数调用时,对应的栈空间在函数返回前是专用的函数调用结束后,栈空间将被释放,数据不再有效

下面看一个指向栈数据的指针:

#includestdio.h

int*g()

inta[10]={0};

returna;

voidf()

inti=0;

intb[10]={0,1,2,3,4,5,6,7,8,9};

int*pointer=g();

for(i=0;ii++)

b[i]=pointer[i];

for(i=0;ii++)

printf("%d\n",b[i]);

intmain()

f();

return0;

}

输出结果如下:

如果把

for(i=0;ii++)

{

b[i]=pointer[i];

}

注释了,直接打印pointer[i]里面的数据,如下:

#includestdio.h

int*g()

inta[10]={0};

returna;

voidf()

inti=0;

intb[10]={0,1,2,3,4,5,6,7,8,9};

int*pointer=g();

for(i=0;ii++)

b[i]=pointer[i];

for(i=0;ii++)

printf("%d\n",pointer[i]);

intmain()

f();

return0;

}

输出结果如下:

为什么直接打印pointer[i]里面的值会是这样呢?因为pointer指向的空间是栈空间,栈空间在g()函数返回之后,活动记录就被释放了。被释放后调用printf函数,printf函数需要在栈上面建立一个活动记录。这个活动记录就会有printf函数的参数信息和返回值等,所以pointer所指向的内存里面的数据由于printf函数的调用被改变了。因此,不能返回局部变量的地址,不能返回局部数组的数组名。

五、程序中的堆

堆是程序中一块预留的内存空间,可由程序自由使用堆中被程序申请使用的内存在被主动释放前将一直有效

为什么有了栈还需要堆

答:栈上的数据在函数返回后就会被释放掉,无法传递到函数外部,如:局部数组

C语言程序中通过库函数的调用获得堆空间

头文件:malloc.hmalloc--以字节的方式动态申请堆空间free--将堆空间归还给系统

系统对堆空间的管理方式

空闲链表法,位图法,对象池法等等

以int*p=(int*)malloc(sizeof(int));为例,要申请4个字节的大小,遍历之后发现跟5Bytes这个节点最接近,找到一个可以用的单元之后,就将这个单元的地址返还给了p指针。以前也提过使用malloc申请内存空间时返回的内存空间可能比申请的实际内存空间要大一点点,原因就是在空闲链表管理堆空间这样的系统里面,它会找最近的那个,找到后的一般都大于等于所需要的内存空间,假如5Bytes这个节点下所有的空闲内存单元都用完的话,就会找12Bytes节点下的内存单元,这样malloc返回的内存空间就有可能比自己实际申请的内存空间要大。

六、程序中的静态存储区

静态存储区随着程序的运行而分配空间静态存储区的生命周期直到程序运行结束在程序的编译期静态存储区的大小就已经确定静态存储区主要用于保存全局变量和静态局部变量静态存储区的信息最终会保存到可执行程序中

下面看一个静态存储区的验证代码:

#includestdio.h

intg_v=1;

staticintg_vs=2;

voidf()

staticintg_vl=3;

printf("%p\n",g_vl);

intmain()

printf("%p\n",g_v);

printf("%p\n",g_vs);

f();

return0;

}

输出结果如下:

可以看到这三个地址是顺序存放的,因为这三个

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论