c语言之栈存储区和堆区理解

来源:互联网 发布:英国大学网络教育 编辑:程序博客网 时间:2024/06/03 21:58

栈:就是迟到早退、先进后出;内存的分配、释放管理都是由系统自己完成,不需要自己管理;

堆:是由自己动态申请的,如果不释放,会一直存在的;申请内存的时候会用到关键字mallco

下面是一个堆的申请返回和栈的内存分配返回  可以看出它们的生命周期和内存管理机制

//手动申请内存空间 这是存储与堆中的char* getMalloc(int num){char* p1 = NULL;/*malloc:申请内存空间的关键字,需要申请多大的内存空sizeof:求出一个类型的字节数sizeof(char):char类型所占的字节数sizeof(char)*num:所要申请的总字节数把申请的堆地址赋值给局部变量 同时局部变量也会被放入栈中  有自己的存储空间*/p1 = (char*)malloc(sizeof(char)*num);//这里判断是否申请成功,可能会存在申请失败的情况if (p1 == NULL){return NULL;}//返回申请的地址 然后析构p1 栈中不会存在p1,自动释放return p1;}char* getStatck(){//在栈中分配64字节的空间char arry[64];    //向栈空间中写入数据strcpy(arry, "Rose_Girls");/*这里返回arry的内存地址, 在这里会出现问题的,由于arry是临时变量,离开当去区域,就会被析构,*/return arry;}int _tmain(int argc, _TCHAR* argv[]){char* tmp = NULL;tmp = getMalloc(100);if (tmp == NULL){printf("申请失败");return 0;}//向tmp所指向的内存空间写入数据,也就是给申请的内存空间中写入数据strcpy(tmp, "Rose_Grils");//调用栈中内存的返回值 由于是局部临时变量 返回会存在问题tmp = getStatck();return 0;}



1 0
原创粉丝点击