高地址和低地址

1. 下面程序输出是多少?

Union U {
  
char  str[ 2 ];
  
short   int  num;
};
int  main() {
  U u;
  u.str[
0 =   10 ;
  u.str[
1 =   1 ;
  cout 
<<  u.num  <<  endl;
  system(
" PAUSE " );
  
return   0 ;
}

     结果为266。对于整数类型,都是低字节存低位,高字节存高位,因此低位是10,高位是1,结果=1*256+10=266。

2. 下面不同变量之间地址大小关系

class  Test {
public :
  
int  m;
  
int  n;
};

int  main() {
  
int  a;
  
char  b;
  
int  c[ 10 ];
  Test t;
  cout 
<<  (size_t) & <<  endl;
  cout 
<<  (size_t) & <<  endl;
  cout 
<<  (size_t) & <<  endl;
  cout 
<<  (size_t) & <<  endl;
  cout 
<<  (size_t) & t.m  <<  endl;
  cout 
<<  (size_t) & t.n  <<  endl;
  system(
" PAUSE " );
  
return   0 ;
}

     (size_t)&a > (size_t)&b > (size_t)&c > (size_t)&t.n > (size_t)&t.m = (size_t)t
     2293612   > 2293611  >  2293552  >  2293548     > 2293544      = 2293544
     a、b、c、t都是局部变量,在栈上存储,栈是从高地址到低地址,因此地址逐渐减小。结构体内部,先定义的地址小,后定义的地址大,这与类内的成员,数组总的元素,都是类似的。
     此外,值得注意的是(size_t)&a-(size_t)&b=1,刚好是1个字节,即b的大小。(size_t)&b-(size_t)&c=59,这是因为首先需要字节对齐,补3个字节,从2293611,补到2293608,从2293607到2293552剩下的44个字节是数组占用,注意数组只有10个元素是40个字节,还有4个字节应该是数组名占用的,把数组名看作一个指针?或者是数组名本身包含数组长度的信息,具体情况不是很清楚,不过int a[10]占用的空间是44个字节,而10个int类型的变量占用40个字节。t的字节分配很简单,没有什么了。
    总的来说,具体的地址,需要考虑“栈的高地址到低地址”和“字节对齐”以及“数组”这样的特殊情况等等。

3. 总结
    整数类型内部:低地址存储低位,高地址存储高位。
    局部变量:先定义的高地址,后定义的低地址。
    类,结构体,数组:先定义的低地址,后定义的高地址。
    数组实际占用的空间,要比元素大,感觉上像是给数组名本身一个“指针类型”的空间,即4个字节。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值