运行结果(Release版本,XP系统)如下:

可以看出:

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

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

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

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

 

上面程序全在一个主函数中,下面增加函数调用,看看函数的参数和函数中变量会分配在什么地方。

程序如下:

[cpp] view plaincopy

 
  1. #include <stdio.h>  
  2. void fun(int i)  
  3. {  
  4.     int j = i;  
  5.     static int s_i = 100;  
  6.     static int s_j;  
  7.   
  8.     printf("子函数的参数:        0x%p = %d ", &i, i);  
  9.     printf("子函数 栈中数据地址: 0x%p = %d ", &j, j);  
  10.     printf("子函数 静态数据地址(有初值): 0x%p = %d ", &s_i, s_i);  
  11.     printf("子函数 静态数据地址(无初值): 0x%p = %d ", &s_j, s_j);  
  12. }  
  13. int main()  
  14. {  
  15.     int i = 5;  
  16.     static int s_i = 100;  
  17.     static int s_j;  
  18.   
  19.     printf("主函数 栈中数据地址: 0x%p = %d ", &i, i);  
  20.     printf("主函数 静态数据地址(有初值): 0x%p = %d ", &s_i, s_i);  
  21.     printf("子函数 静态数据地址(无初值): 0x%p = %d ", &s_j, s_j);  
  22.     putchar(' ');  
  23.   
  24.     fun(i);  
  25.     return 0;  
  26. }