原创 关于C对变量地址的处理(原创)

2010-4-24 23:09 2836 7 8 分类: 软件与OS

                 

                   关于C对变量地址的处理(原创)

心中一直对c语言对变量地址的处理有一些疑问,比如对于多字节变量,变量地址是指向高字节还是低字节,与大小端是否有关等等。今天测试了一下,心中的石头落地。

测试环境Keil uVision3, C-FREE4.0

之所以选择这两个环境是因为Keil uVision3将51单片机配置为大端,

    C-FREE 针对X86,是小端。

测试代码

int main(void)

{          

  long int i = 1;         //定义4字节长度的整形变量 

  short int si = 1;       //定义2字节长度的整形变量 

  char c = 'e';           //定义1字节长度的字符形变量

  long int* pi = &i;      //指向4字节长度的整形变量的指针变量 

  short int* psi = &si;   //指向2字节长度的整形变量的指针变量 

  char* pc = &c;          //指向1字节长度的整形变量的指针变量 

  char* pi2c = (char*)&i; //将指向4字节长度的整形变量的指针强制

                             //转
指向1字节长度的字符形变量的指针
                          

  return 0;   

}

1、Keil uVision3测试结果

  

   下图为变量的地址

 ad484659-a7b0-4fdb-91bb-5d5a2d8169ea.jpg


   下图为内存数据

a017caba-0d09-4533-a58f-100318a94cbf.jpg


可以看出51单片机的栈是向上生长的,内存分配情况如下依次为i,si,c

0~7被工作寄存器占用,从8开始才被程序使用


内存地址

0x08

0x09

0x0a

0x0b

00

00

00

01

内存地址

0x0c

0x0d

00

01

    

       

内存地址

0x0e

65

     

      可以清楚地看出

          *51的多字节变量的低字节放在高内存地址,为大端

          *变量的指针为低内存地址,这个可要注意了,当将4字节变量的指 

          针强制转换为单字节变量的指针再取变量时,取得的并不是原数据低

          位,而是高位!

     2、C-FREE的测试结果

    下图为变量的地址

95a309ef-0606-4c74-8515-2118a8a7fb77.jpg

     下图为内存数据

      

f61d1cd7-ee71-4335-be5b-bc3394fc4e1c.jpg


 可以看出X86的栈是向下生长的,内存分配情况如下,依次为 i,si,c

 

内存地址

0x240ff5c

0x240ff5d

0x240ff5e

0x240ff5f

01

00

00

00

内存地址

0x240ff5a

0x240ff5b

01

00

       

内存地址

0x240ff59

65

        可以清楚地看出

          *X86的多字节变量的低字节放在低内存地址,为小端

  *变量的指针为低内存地址

     

     3、总结

        通过以上此时,大概可以知道C语言对变量地址的处理了

        *无论为大端、小端,变量的地址都为低内存地址。

         所以做指针类型强制转换时要注意了。

        

         意外的收获:清楚了编译器是如何依次为变量分配栈空间的。

    

附件:https://static.assets-stash.eet-china.com/album/old-resources/2010/4/24/d2aeb6f5-54e0-4f4d-a23a-2bd561b08c68.rar


PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2012-12-4 19:44

不错

相关推荐阅读
用户251334 2010-11-21 22:54
VMware 运行 WINCE
参考网上的一些资料,终于从VMware启动了WinCE,把制作过程写成了一篇文章,欢迎下载,希望对大家有所帮助。还有相关制作文件和最终的虚拟机文件。DOS系统相关文件:...
用户251334 2010-11-09 19:50
DSP小数运算
在DSP世界中,由于DSP芯片的限制,经常使用定点小数运算。所谓定点小数,实际上就是用整数来进行小数运算。下面先介绍定点小数的一些理论知识,然后以C语言为例,介绍一下定点小数运算的方法。在TIC500...
用户251334 2010-10-20 18:32
TMS DSP 存储空间与存储器使用心得
1、存储空间和存储器存储空间只是一个地址空间,本身无存储功能。存储器有存储数据和输出数据的能力,用途不一定,尽管有ROM和RAM之分。2、存储空间共用3个存储空间:程序空间、数据空间、IO空间。大小均...
用户251334 2010-09-07 20:46
电脑连接手机上网(无需使用诺基亚PC套件)
     一种很方便的联网方式,适合断网和旅行的时候用。首先将USB蓝牙收发器(淘宝上几块钱一个)插入电脑,系统会自动安装驱动。驱动安装好后,打开”网上邻居“,会发现“网络连接“里面除了有以前的连接方...
用户251334 2010-09-01 12:20
简单的方式理解多维数组
 简单的方式理解多维数组多维数组对于学习c语言的新手往往成为一个难点,尤其对数组名代表的意义比较模糊,本文用了一种很清晰的思路说明了这些问题。举例比较容易说明问题,这里用了一个二维数组:#includ...
用户251334 2010-06-13 19:33
如何使用双极三极管设计开关电路
   如何使用双极三极管设计开关电路某些刚刚电子初学者对三极管用作开关时,有些疑惑,并且看到网上的部分文章都是抄来抄去,且有些甚至是不合适的设计,使新手还是一头雾水。想就自己的经验谈一谈这些问题。希望...
EE直播间
更多
我要评论
1
7
关闭 站长推荐上一条 /3 下一条