免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1696 | 回复: 3
打印 上一主题 下一主题

[C] 内层中数据对齐问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-10 12:46 |只看该作者 |倒序浏览
5可用积分

  1. [root@localhost test]# cat address.c
  2. #include <stdio.h>

  3. int main(int argc,char** argv)
  4. {
  5. int a;
  6. char b;
  7. int c;

  8. printf("a is 0x%08x\nb is 0x%08x\nc is 0x%08x\n",&a,&b,&c);
  9. return 0;
  10. }
  11. [root@localhost test]# ./address
  12. a is 0xbff2d700
  13. b is 0xbff2d6ff
  14. c is 0xbff2d6f8

复制代码


看出linux内存的增长方向是向Low的..这个可以见我的下一个程序
  1. #include <stdio.h>

  2. void* n;

  3. typedef enum
  4. {
  5.   GROW_HIGH,
  6.   GROW_LOW
  7. }STACK;


  8. STACK testStack(void* p)
  9. {
  10.   n=&p;
  11.   if(n==NULL)
  12.      return testStack(n);
  13.   else{
  14.       if(n<p)
  15.         return GROW_HIGH;
  16.        return GROW_LOW;
  17.      }
  18. }

  19. int main()
  20. {
  21. STACK statck_direct = testStack(NULL);
  22. printf("%d\n",statck_direct);
  23. return 0;
  24. }

复制代码


这个结果有点不懂
[root@localhost test]# ./address
a is 0xbff2d700
b is 0xbff2d6ff
c is 0xbff2d6f8

我个人理解的是
那么a就是0xbff2d703-0xbff2d700
        b        0xbff2d700-0xbff2d6ff
        c        0xbff2d6ff-0xbff2d6fb


gcc -S了下 看不懂!!!   赐教


我gcc -O2优化了下后 结果更加离谱:
[root@localhost test]# ./address
a is 0xbfa3b20c
b is 0xbfa3b213
c is 0xbfa3b208

论坛徽章:
0
2 [报告]
发表于 2009-06-10 13:36 |只看该作者
结构体的成员在内存中并不一定非得是连续按顺序存放,只要编译器能找得到就行。kaspersky Kris 在《黑客反汇编揭秘》中讲过。
不知我回答得是不是楼住想要的?

论坛徽章:
0
3 [报告]
发表于 2009-06-10 14:00 |只看该作者
堆是向上的,栈是向下的啊.
把你的例子换成malloc的方式结果是反的啊.

默认四字节对齐的吧.所以a,b,c都占四字节.
按你的分配地址来说...
a从0xbff2d703到0xbff2d700;地址为0xbff2d700;
b只需要使用0xbff2d6ff,但是需要4字节内存对齐;而且是自上向下的.则需要留出0xbff2d6fe到0xbff2d6fc;所以地址是0xbff2d6ff;
c从0xbff2d6fb到0xbff2d6f8;地址为0xbff2d6f8;

应该没有什么实际意义啊。一般都是结构体.不管堆栈什么的.内部地址都是从低到高的吧...

论坛徽章:
0
4 [报告]
发表于 2009-06-10 18:52 |只看该作者
原帖由 swxlion 于 2009-6-10 13:36 发表
结构体的成员在内存中并不一定非得是连续按顺序存放,只要编译器能找得到就行。kaspersky Kris 在《黑客反汇编揭秘》中讲过。
不知我回答得是不是楼住想要的?


顶这句,特别是一些数组变量,编译器会在其前后空出一段内存,以防止下标越界产生错误。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP