zoukankan      html  css  js  c++  java
  • 关于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测试结果

      

       下图为变量的地址

     

     

     

       下图为内存数据

    可以看出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的测试结果

        下图为变量的地址

     

         下图为内存数据

          

     

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

     

    内存地址

    0x240ff5c

    0x240ff5d

    0x240ff5e

    0x240ff5f

    01

    00

    00

    00

     

     

    内存地址

    0x240ff5a

    0x240ff5b

    01

    00

           

    内存地址

    0x240ff59

    65

          可以清楚地看出

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

         3、总结

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

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

          所以做指针类型强制转换时要注意了。意外的收获:清楚了编译器是如何依次为变量分配栈空间的。

  • 相关阅读:
    jdbc框架 commons-dbutils的使用
    SpringBoot整合Quartz和H2的例子
    Microsoft VS 2008 过期解决方法
    数据库事务的隔离级别
    angularJS中ng-if的用法
    angularJS中ng-change的用法
    Hello,Akka
    Yum常用命令及Yum中文手册
    最大堆的插入/删除/调整/排序操作(图解+程序)(JAVA)
    别人要访问我的电脑上部署的tomcat,必须关闭防火墙吗?
  • 原文地址:https://www.cnblogs.com/JonnyLulu/p/4183831.html
Copyright © 2011-2022 走看看