变量的存储空间

来源:互联网 发布:网络硬盘录像机好吗 编辑:程序博客网 时间:2024/05/01 13:17

变量的存储空间

一般全局变量存放在数据区,局部变量放在栈区,动态变量放在堆区,函数代码放在代码区。

1. 内存分布

一个由C/C++编译的程序占用的内存分为以下几个部分:

栈区(stack)-由编译器自动分配释放,存放函数的参数值,局部变量的值等。

堆区(heap)- 一般由程序员自行分配和释放,若程序员不释放,程序结束时可能由OS回收。

全局区(静态区)- 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量放在一块区域,未初始化的全局变量放在相邻的另一块区域。程序结束时由系统释放。

文字常量区 - 字符串常量放在这里,程序结束时由系统释放。

程序代码区 - 存放二进制代码。

实例程序:

//main.c

int a = 0; //全局初始化区

char *p1;  //全局未初始化区

main()

{

 int b; //栈

 char s[] ="abc"; //栈

 char *p2;         //栈

 char *p3 ="123456"; //123456/0在常量区,p3在栈上

 static int c = 0;    //全局(静态)初始化区

 p1 = (char*)malloc(10);

 p2 = (char*)malloc(20); //分配得到的10和20字节区域在堆区

 strcpy(p1,"123456");  //123456/0在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方   

}

 

2. 堆和栈的区别

栈是系统提供的功能,特点是快速高效,缺点是有限制,不够灵活;堆有函数库提供的功能,特点是灵活方便,但效率比栈略有下降。栈是系统数据结构,对于进程和线程是唯一的;堆是数据库内部结构,不一定唯一。一般来说,栈是有编译器静态分配;堆是程序员动态分配。

申请方式:栈由系统自动分配,堆由程序员自行分配。

分配方式:只要栈的剩余空间大于申请大小,系统将为程序提供内存,否则将报异常提示栈溢出;对于堆,系统有一个记录空闲内存的链表,当系统收到申请时,遍历该链表,寻找大于申请大小的节点,找到后从空闲链表中移除,并将节点的空间分配给程序。

申请效率:栈由系统自动分配,速度较快;堆速度较忙,且易产生碎片,优点是使用方便。

存储内容:栈在函数调用时使用,存放返回地址,函数输入参数和局部变量;堆中的具体内容由程序员自行决定。


3. char p[] vs. char *p

在函数里charp[] ="hello world"char *p ="Hello world" 造成的效果不一样。请看两个程序:

(1)

char *GetString(void)

{

  char p[] ="Hello world";

  return p;

}

void main()

{

  char *str = NULL;

  str = GetString();

  cout << str<< endl;

}

 

(2)

char *GetString(void)

{

  char *p ="Hello world";

  return p;

}

void main()

{

  char *str = NULL;

  str = GetString();

  cout << str<< endl;

}

记过:(1)输出的是乱码,(2)能够输出 hello world

 

"Hello world"作为静态字符串实际上存储在数据区,但写程序的人不知道这个地址,而程序本身知道。当某一函数以

{ char p[] ="Helloworld"; ...}方式使用此静态字符串时,实际上相当于:

char p[12];

strcpy(p,"Hello world");

....

p[12]是在栈里临时分配的。虽然p指向的内容是"Helloworld", 但是这是复制品,不是原件。当函数结束,char p[]就被程序回收了,所以p[]的内容就不再是"Hello world"了。

但如果以char*p="Hello world"的方式使用,p指向的是静态字符串存储的位置,也就是说指向"Helloworld"的原件,当然没有问题了。如果想坚持用char p[]而不使用char *p, 有效方法必须是:

{

  static char p[]="Hello world";  //static char []是静态的,存储在数据区。

  return p;

}

 

4. 参考资料

http://blog.csdn.net/diablof/article/details/3474390

http://blog.sina.com.cn/s/blog_62c920590100igwa.html

http://www.cnblogs.com/riky/archive/2006/12/28/606106.html