这是本人第一次发表技术类博客,以后我会将我在工作中学会的,我觉得很经典和重要的技术类问题通过此种方式与大家共享。
本人技术水平有限,可能会发表一些大侠们觉得幼稚的问题,如果觉得幼稚了请跳过,谢谢。如果有什么嵌入式相关的技术问题,大家可以一并提出来我们大家讨论解决。
前言写完,接下来是一个C语言相关的问题。
int main
{
int a[] = {1, 2, 3};
int *p = (int*)((int)a + 1);
printf("%x/n",*p);
}
X86下输出结果为:2000000
为什么输出会是2000000,现在来分析下。
1. 首先我们要知道X86下的内存大小端问题。可通过下面代码测试, 返回1表示小端内存0表示是大端内存。
int memType(void)
{
union test{
int a;
char b;
};
union test c;
c.a = 1;
return c.b;
}
2. 通过上面的代码可以测出X86是小端内存数组a的内存分布:
3.源码int *p = (int*)((int)a + 1)。
(int)a + 1,其实是把a作为数值加一
所以p指向了a所指字节的下一个字节,如图:
4.语句printf("%x/n",*p);以十六进制打印p所指向的地址处的一个int型数据。
因为是小端内存,地位在底地址。
所以:输出为,2000000