Chinaunix首页 | 论坛 | 博客
  • 博客访问: 387773
  • 博文数量: 165
  • 博客积分: 436
  • 博客等级: 下士
  • 技术积分: 887
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-10 02:49
文章分类

全部博文(165)

文章存档

2012年(95)

2011年(70)

分类:

2012-01-12 20:48:22

Linux C程序存储空间的逻辑布局
 
一、APUE上指出了 Linux C程序存储空间的逻辑布局,对于 X86上的Linux
    正文段从 0x08048000单元开始
    栈底则在 0xC0000000之下开始 (栈从高地址向低地址生长)
图如下:
 
二、例程
    实现一个函数f(),不用指针,实现在函数内修改传入参数的值。
  1. #include "stdio.h"
  2. #include "sys/types.h"

  3. void f1(u_int32_t a)
  4. {
  5.     printf("%p\n", &a);

  6.     u_int8_t *ap = (u_int8_t *)&a;
  7.     while(++ap)
  8.     {
  9.         printf("%p\n", ap);
  10.         
  11.         if( *ap == a)
  12.         {
  13.             *ap = 7;
  14.             break;
  15.         }
  16.     }
  17. }

  18. main()
  19. {
  20.     u_int32_t i = 123;
  21.     printf("%p\n", &i);
  22.     
  23.     f1(i);
  24.    
  25.     printf("%d\n", i);
  26. }
运行结果
  1. /* * * result * * */
  2. /*
  3. BTC:/home/leon/test # ./a.out
  4. 0xbf905300
  5. 0xbf9052e0
  6. 0xbf9052e1
  7. 0xbf9052e2
  8. 0xbf9052e3
  9. 0xbf9052e4
  10. 0xbf9052e5
  11. 0xbf9052e6
  12. 0xbf9052e7
  13. 0xbf9052e8
  14. 0xbf9052e9
  15. 0xbf9052ea
  16. 0xbf9052eb
  17. 0xbf9052ec
  18. 0xbf9052ed
  19. 0xbf9052ee
  20. 0xbf9052ef
  21. 0xbf9052f0
  22. 0xbf9052f1
  23. 0xbf9052f2
  24. 0xbf9052f3
  25. 0xbf9052f4
  26. 0xbf9052f5
  27. 0xbf9052f6
  28. 0xbf9052f7
  29. 0xbf9052f8
  30. 0xbf9052f9
  31. 0xbf9052fa
  32. 0xbf9052fb
  33. 0xbf9052fc
  34. 0xbf9052fd
  35. 0xbf9052fe
  36. 0xbf9052ff
  37. 0xbf905300
  38. 7
  39. */

从结果可以清晰的看到:
1 进入函数f1()后,栈“向下”生长了。
2 通过直接访问栈内容,修改了栈内的值。

注:这种操作相当不安全,因为不能保证栈内没有其它相同的值。

 

阅读(525) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~