内存大小端、指针实际应用题分析

来源:互联网 发布:红色警戒 for mac 编辑:程序博客网 时间:2024/05/13 15:20

     这是本人第一次发表技术类博客,以后我会将我在工作中学会的,我觉得很经典和重要的技术类问题通过此种方式与大家共享。

本人技术水平有限,可能会发表一些大侠们觉得幼稚的问题,如果觉得幼稚了请跳过,谢谢。如果有什么嵌入式相关的技术问题,大家可以一并提出来我们大家讨论解决。

 

     前言写完,接下来是一个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

 

原创粉丝点击