您的位置:首页 > 编程语言 > C语言/C++

C/C++ | 变量的内存分配

2015-10-02 00:26 363 查看
C/C++ 程序占用的内存分布:

  栈区(stack): 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;
  堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由系统回收 ;
  全局区(静态区)(static):全局变量和静态变量的存储是放在“一块的”;
  文字常量区:这里需要分很多种情况,详情见下面的代码;
  程序代码区:存放函数体的二进制代码。

内存低端

| -> 程序段:二进制机器码和只读数据

| -> 数据段:静态数据

| -> 堆栈 :动态数据

内存高端

C++ 中变量是如何分布的呢,直接上代码会比较直观:

int global_uninited;
int global_inited = 1;

int main()
{
static int s_local_uninited;
static int s_local_inited = 0;

int local_inited = 1;
int local_uninited;

char str_static1[8];
char str_static2[] = "abcdEFG";
char *str_dynamic = "abcdEFG";    // ERROR: str_dynamic[2] = 'C';

printf("0x%x: global_uninited\n", &global_uninited);    // 0x47e008
printf("0x%x: global_inited\n", &global_inited);        // 0x473000
printf("0x%x: s_local_uninited\n", &s_local_uninited);    // 0x47e010
printf("0x%x: s_local_inited\n\n", &s_local_inited);    // 0x47e014

printf("0x%x: local_inited\n", &local_inited);            // 0x28ff1c
printf("0x%x: local_uninited\n", &local_uninited);        // 0x28ff18

printf("0x%x: &str_static1\n", &str_static1);            // 0x28ff10
printf("0x%x: &str_static2\n", &str_static2);            // 0x28ff08
printf("0x%x: &str_dynamic\n", &str_dynamic);            // 0x28ff04
printf("0x%x: str_static1\n", str_static1);                // 0x28ff10
printf("0x%x: str_static2\n", str_static2);                // 0x28ff08
printf("0x%x: str_dynamic\n\n", str_dynamic);            // 0x474027

return 0;
}


16 - 19 行:未初始化的全局变量和局部静态变量(是否初始化无关)是相邻的(隔了4字节)。而初识化的全局变量则预留了约 0xb000 字节空间(?)。

21 - 28 行:函数体内的一般变量、指针变量(动态数组的指针变量也是)、静态数组(整个数组),都放在栈中。而且栈是又高地址往下分配的,所以栈有大小限制。

29 行:动态分配的数据放在堆中

13 - 14 行:字面常量放置的位置在不同情况下会不同,14 行放在堆中,然后指针指向其首地址,指针可变,但其指向的内容是常量,不可变。

关于字面常量的优化:char *str_dynamic2 = "abcDEFG";  // str_dynamic2 == str_dynamic

更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: