写了一个示例代码,如下
int g_var;
int g_var_init_z=0;
int g_var_init =10;
const int? c_g_var;
const int? c_g_var_z=0;
const int? c_g_var_init=20;
int main()
{
? ? static int s_var;
? ? static int s_var_init_z=0;
? ? static int s_var_init =30;
? ? int var;
? ? int var_init_z=0;
? ? int var_init =40;
? ? int tmp= g_var+ g_var_init_z +g_var_init? + c_g_var? + c_g_var_z? + c_g_var_init + s_var + s_var_init_z +? s_var_init + var + var_init_z + var_init;
? ? const int *p[14];
? ? int i=0;
? ? p[i++] = &g_var;? ? ? ?
? ? p[i++] = &g_var_init_z;? ;
? ? p[i++] = &g_var_init? ? ;
? ? p[i++] = &c_g_var? ? ? ;
? ? p[i++] = &c_g_var_z? ? ;
? ? p[i++] = &c_g_var_init? ;
? ? p[i++] = &s_var? ? ? ? ;
? ? p[i++] = &s_var_init_z ;
? ? p[i++] = &s_var_init? ;
? ? p[i++] = &var? ? ? ? ;
? ? p[i++] = &var_init_z ;
? ? p[i++] = &var_init;
? ? while(1)
? ? {
? ? }
}
编译之后,在线运行可以看到,p数组中的数值即为各种变量所存放的地址
结论为:
可读可写的全局变量放置在内存起始位置
然后是静态可读写变量,
然后是初始化为0,或者未初始化的全局变量,未初始化的全局变量会被编译器初始化为0
然后是静态的初始化为0的变量以及未初始化的静态变量,也被编译器初始化为0,
再往后就是进来函数后,定义的局部变量,存放在栈中
还有带有const的只读变量的存储位置为flash中,不需要加载到内存中,读取的时候,直接访问flash即可