c&c++中变量在内存中的存储

C/C++变量在内存中的分布在笔试时经常考到,虽然简单,但也容易忘记,因此在这作个总结,以加深印象。

先写一个测试程序:

view plain copy to clipboard print ?
  1. #include <stdio.h> 
  2. #include <malloc.h> 
  3. int g_i = 100; 
  4. int g_j = 200; 
  5. int g_k, g_h; 
  6. int main() 
  7.     const int MAXN = 100; 
  8.     int *p = (int*)malloc(MAXN * sizeof(int)); 
  9.     static int s_i = 5; 
  10.     static int s_j = 10; 
  11.     static int s_k; 
  12.     static int s_h; 
  13.     int i = 5; 
  14.     int j = 10; 
  15.     int k = 20; 
  16.     int f, h; 
  17.     char *pstr1 = "MoreWindows123456789"
  18.     char *pstr2 = "MoreWindows123456789"
  19.     char *pstr3 = "Hello"
  20.      
  21.      
  22.     printf("堆中数据地址:0x%08x\n", p); 
  23.      
  24.     putchar('\n'); 
  25.     printf("栈中数据地址(有初值):0x%08x = %d\n", &i, i); 
  26.     printf("栈中数据地址(有初值):0x%08x = %d\n", &j, j); 
  27.     printf("栈中数据地址(有初值):0x%08x = %d\n", &k, k); 
  28.     printf("栈中数据地址(无初值):0x%08x = %d\n", &f, f); 
  29.     printf("栈中数据地址(无初值):0x%08x = %d\n", &h, h); 
  30.      
  31.     putchar('\n'); 
  32.     printf("静态数据地址(有初值):0x%08x = %d\n", &s_i, s_i); 
  33.     printf("静态数据地址(有初值):0x%08x = %d\n", &s_j, s_j); 
  34.     printf("静态数据地址(无初值):0x%08x = %d\n", &s_k, s_k); 
  35.     printf("静态数据地址(无初值):0x%08x = %d\n", &s_h, s_h); 
  36.      
  37.     putchar('\n'); 
  38.     printf("全局数据地址(有初值):0x%08x = %d\n", &g_i, g_i); 
  39.     printf("全局数据地址(有初值):0x%08x = %d\n", &g_j, g_j); 
  40.     printf("全局数据地址(无初值):0x%08x = %d\n", &g_k, g_k); 
  41.     printf("全局数据地址(无初值):0x%08x = %d\n", &g_h, g_h); 
  42.      
  43.     putchar('\n'); 
  44.     printf("字符串常量数据地址:0x%08x 指向 0x%08x 内容为-%s\n", &pstr1, pstr1, pstr1); 
  45.     printf("字符串常量数据地址:0x%08x 指向 0x%08x 内容为-%s\n", &pstr2, pstr2, pstr2); 
  46.     printf("字符串常量数据地址:0x%08x 指向 0x%08x 内容为-%s\n", &pstr3, pstr3, pstr3); 
  47.     free(p); 
  48.     return 0; 
#include <stdio.h> #include <malloc.h> int g_i = 100; int g_j = 200; int g_k, g_h; int main() { const int MAXN = 100; int *p = (int*)malloc(MAXN * sizeof(int)); static int s_i = 5; static int s_j = 10; static int s_k; static int s_h; int i = 5; int j = 10; int k = 20; int f, h; char *pstr1 = "MoreWindows123456789"; char *pstr2 = "MoreWindows123456789"; char *pstr3 = "Hello"; printf("堆中数据地址:0x%08x\n", p); putchar('\n'); printf("栈中数据地址(有初值):0x%08x = %d\n", &i, i); printf("栈中数据地址(有初值):0x%08x = %d\n", &j, j); printf("栈中数据地址(有初值):0x%08x = %d\n", &k, k); printf("栈中数据地址(无初值):0x%08x = %d\n", &f, f); printf("栈中数据地址(无初值):0x%08x = %d\n", &h, h); putchar('\n'); printf("静态数据地址(有初值):0x%08x = %d\n", &s_i, s_i); printf("静态数据地址(有初值):0x%08x = %d\n", &s_j, s_j); printf("静态数据地址(无初值):0x%08x = %d\n", &s_k, s_k); printf("静态数据地址(无初值):0x%08x = %d\n", &s_h, s_h); putchar('\n'); printf("全局数据地址(有初值):0x%08x = %d\n", &g_i, g_i); printf("全局数据地址(有初值):0x%08x = %d\n", &g_j, g_j); printf("全局数据地址(无初值):0x%08x = %d\n", &g_k, g_k); printf("全局数据地址(无初值):0x%08x = %d\n", &g_h, g_h); putchar('\n'); printf("字符串常量数据地址:0x%08x 指向 0x%08x 内容为-%s\n", &pstr1, pstr1, pstr1); printf("字符串常量数据地址:0x%08x 指向 0x%08x 内容为-%s\n", &pstr2, pstr2, pstr2); printf("字符串常量数据地址:0x%08x 指向 0x%08x 内容为-%s\n", &pstr3, pstr3, pstr3); free(p); return 0; }

运行结果(Release版本)如下:

c&c++中变量在内存中的存储_第1张图片

可以看出:

1.      变量在内存地址的分布为:堆-栈-代码区-全局静态-常量数据

2.      同一区域的各变量按声明的顺序在内存的中依次由低到高分配空间(只有未赋值的全局变量是个例外)。

3.      全局变量和静态变量如果不赋值,默认为0。 栈中的变量如果不赋值,则是一个随机的数据。

4.      编译器会认为全局变量和静态变量是等同的,已初始化的全局变量和静态变量分配在一起,未初始化的全局变量和静态变量分配在另一起。

你可能感兴趣的:(C++,c,测试,存储,编译器)