您的位置:首页 > 编程语言 > C语言/C++

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

2015-10-24 16:45 363 查看
栈:就是迟到早退、先进后出;内存的分配、释放管理都是由系统自己完成,不需要自己管理;

堆:是由自己动态申请的,如果不释放,会一直存在的;申请内存的时候会用到关键字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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言 内存