第一句子网 - 唯美句子、句子迷、好句子大全
第一句子网 > 简述C语言动态 静态内存分配

简述C语言动态 静态内存分配

时间:2020-07-04 14:12:56

相关推荐

简述C语言动态 静态内存分配

#include <stdio.h>#include <stdlib.h>/**c语言静态内存分配*/void func(int** address ){//定义int类型的i变量,并赋值100int i = 100;//把i对应的地址赋值给iPoint变量*address = &i;}int main(int argc, char *argv[]){//定义int类型的一级指针变量iPointint* iPoint;func(&iPoint);printf("*iPoint==%d\n",*iPooint); //打印值为100printf("*iPoint==%d\n",*iPooint); //打印值为-2 (变为垃圾值)system("pause");return 0;}原因:静态内存是程序编译执行后系统自动分配,由系统自动释放,静态内存是栈分配的。在我们执行完func方法后,系统会在不确定的时间回收内存,当再次去调用时,若被系统回收,则无法取到对应地址的值。具体执行过程如下图:

当调用func方法时,会创建func函数,并将iPoint的地址存入address的二级指针中,*address = &i 语句执行时,是将i变量的地址存入address对应的1000H地址中,当打印*iPooint时会取3000H地址对应的值100,当func被系统回收后,再取值会取不到值。/**c语言动态内存分配*/void func(int** address ){int i = 100;int* temp;//malloc(int) --内存地址 此方法返回的是内存地址temp = malloc(sizeof(int));//把i对应的值,赋值给temp地址对应的值*temp = i;//把address对应的地址对应的值修改成temp*address = temp;//free(temp); //释放内存}int main(int argc, char *argv[]){//定义int类型的一级指针变量iPointint* iPoint;func(&iPoint);printf("*iPoint==%d\n",*iPooint); //打印值为100printf("*iPoint==%d\n",*iPooint); //打印值为100 (内存没有被回收)system("pause");return 0;}动态内存是开发者手动去分配的,是堆分配的。具体执行过程如下图:

当调用func方法时,会创建func函数,并将iPoint的地址存入address的二级指针中,接下来创建int变量i,值为100,创建temp一级指针,在堆内申请一块内存,并将地址存入temp地址所对应的值中,*temp = i语句执行后,将temp对应的5000H对应的值修改为100,*address = temp语句是将temp中的5000H写入address对应的地址值中。当打印*iPooint时,会通过地址5000H去堆内存去取,即使func被系统回收也不影响。内存分配方式:(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。(2) 在栈上创建。在执行函数时,函数内部局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放,栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(3) 从堆上分配。亦称动态内存分配。程序在运行的时候用malloc或new申请任意多的内存,程序员自己负责在什么时候free或delete释放内存。动态内存的生存期有程序员决定,使用非常灵活,但问题也最多。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。