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可以在临时区分配内存,用完后自动被系统回收。多个函数都是用同一个堆区,栈区

 

  指针指向谁,就把谁的地址赋给指针

  指针变量和他所指向的内存空间变量,是两个不同概念

posted @ 2014-11-14 11:29  M3个G  阅读(262)  评论(0编辑  收藏  举报