c语言内存四区模型
c语言内存四区模型: 代码区,全局区(常量区),栈区,堆区
1、常量区
char * getStr1()
{
//字符串常量"abcde"定义在常量区
char *str= "abcde";
//把这个字符串常量地址返回
return str;
}
char * getStr2()
{
//这里的"abcde"和getStr1()方法中的常量值一样
char *str= "abcde";
return str;
}
char *p1 = getStr1();
char *p2 = getStr2();
//p2存储的地址和p1相同,
printf("p1=%d, p2=%d\n", p1, p2);
//在常量区,两个变量的值完全一样,不会重新创建,直接把原来的返回
//只会保留一份
在全局区(常量区),两个字符串完全一样,编译器只会定义一份
2、临时区(栈区)
char * getBuf()
{
char buf[20];
strcpy(buf, "abcde");
return buf;
} //被调函数分配的内存,主调函数不能使用
abcdX? 有乱码! 确实把内存地址返回了,但不能用。
被调函数调用完毕,在临时区分配的内存统统消失
3、堆区
char *buf= (char *)malloc(sizeof(char)*20); //手动malloc申请一份内存,由程序员手动管理
利用malloc()函数,分配的内存空间不会马上释放,由程序员手动管理
用完后free(buf); 否者出现内存泄漏
总结:
主调函数里分配的内存,不管在那个区,都可以在被调函数里使用
如果被调函数在临时区(栈)分配内存,主调函数不能使用
c可以在临时区分配内存,用完后自动被系统回收。多个函数都是用同一个堆区,栈区
指针指向谁,就把谁的地址赋给指针
指针变量和他所指向的内存空间变量,是两个不同概念