本文共 1928 字,大约阅读时间需要 6 分钟。
C++中变量在内存中的存储 一、内存大致可以分为三部分:代码区、堆栈区、静态数据段。C和C++中有全局变量,静态变量以及局部变量等几类。全局变量和静态变量是在编译的时候就已经分配好在数据段,也就是说在执行main函数之前就已经分配好了地址,如果定义的时候已经初始化,那么就存放初始化的值,如果没有初始化,则由编译器初始化为0。这就说明在整个程序的执行过程中全局变量和静态变量的地址和类型不会发生变化,可能变化的只是他的值。对于动态变量,则在编译的阶段并不分配内存,而是执行到相应的代码段时再分配内存。局部变量共有以下几种:1 int main(void) { int a;//局部变量定义于main中 ........... { int a;//局部变量定义于代码段内 } }2 void fun() { int a;//局部变量定义于普通函数内 ... }3 void fun(int a,int b)//形式参数 { ... }编译器对局部变量的处理是放入栈中,出栈和入栈操作的操作数都是跟着指令存在于代码段内的,当函数执行到局部变量处,进行入栈操作,给他分配栈中的内存,供其它操作访问。在使用结束后再出栈。所以,局部变量的生存期是从定义的地方到该函数结束和代码段结束。 二、在C++中,内存管理是一件十分让人畏惧的事,要考虑的方面和情况很多,我认为关键的一点是要知道你的这个内存是属于什么分区中。在C++中程序在运行过程中分为:栈,堆,常量数据区,自由存储区,全局/静态存储区,这些区的管理还是有些区别的。 在栈中分配的变量主要是:参数,函数内定义的局部变量,由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。 堆:主要是用new操作符来定义的申请的内存空间,不是在编译器来管理分配,而是有程序自身来管理申请与销毁。通常是用delete来删除释放内存空间。 常量数据区:存放程序定义的一些常量。常量在理论上是不让改变的。 自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。 全局/静态存储区:存放全局变量及定义的静态变量。 示例:
#include结果为: 测试栈变量using namespace std;char * getValues(){ char ach[]="7guiopkl"; return ach;}char * getValues_2(){ char *ach="qwert"; return ach;}char * getValues_3(){ static char *ach="ihnmbv"; return ach;}char * getValues_4(){ char *ach=new char[7]; memset((void*)ach,0,7); memcpy((void *)ach,"asdfgh",7); return ach;}int main(){ cout<<"测试栈变量"<
*rc =7 rc values =7guiopkl测试常量
*rc2 = q rc2 values =qwert修改常量数据区中的值
*rc2 = 1 rc2 values =1234测试局部静态变量
*rc3 = i rc3 values =ihnmbv修改静态局部变量
*rc3 = q rc3 values =qaws测试局部堆变量
*rc4 = a rc4 values =asdfgh请按任意键继续. . . (1)变量ach定义在局部函数中,所以是局部变量。局部变量存储在栈中,即在栈中开辟一块内存(首地址为ach)用来存放字符串。当局部函数被调用时,局部变量ach入栈,当局部函数结束时出栈,该块内存被释放。函数返回该块栈内存的首地址,由于该地址和新的变量rc绑定,所以返回的地址只指向字符串的第一个字符,后面的内存都释放掉了。所以*rc是'7',rc是乱码了。 (2)在局部函数getValues_2()中,ach是一个局部指针变量,即在栈内存中开辟一个大小为4byte的空间存放指针,字符串"qwert"存放在常量数据区,函数返回栈中存放的地址,这个地址指向常量数据区的中的数据,因此可以解引用。 (3)ach是一个静态指针,它在main之前就分配好了内存(全局/静态存储区),static的值是可以改变的。 (4)ach是存放在栈中的指针,它指向对内存中的一块区域。
转载地址:http://janab.baihongyu.com/