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

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

堆:是由自己动态申请的,如果不释放,会一直存在的;申请内存的时候会用到关键字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语言,栈,堆)