关于Linux C程序存储空间的逻辑布局

发布时间:2016-11-30 00:00:00 编辑:嘉辉 手机版

  Linux C程序存储空间的逻辑布局是怎么样的?为了方便大家,下面YJBYS小编为大家整理了关于Linux C程序存储空间的逻辑布局的文章,希望对你有所帮助。

  一、APUE上指出了 Linux C程序存储空间的逻辑布局,对于 X86上的Linux

  正文段从 0x08048000单元开始

  栈底则在 0xC0000000之下开始 (栈从高地址向低地址生长)

  图如下:

  二、例程

  实现一个函数f(),不用指针,实现在函数内修改传入参数的值。

  #include "stdio.h"

  #include "sys/types.h"

  void f1(u_int32_t a)

  {

  printf("%p\n", &a);

  u_int8_t *ap = (u_int8_t *)&a;

  while(++ap)

  {

  printf("%p\n", ap);

  if( *ap == a)

  {

  *ap = 7;

  break;

  }

  }

  }

  main()

  {

  u_int32_t i = 123;

  printf("%p\n", &i);

  f1(i);

  printf("%d\n", i);

  }

  运行结果

  /* * * result * * */

  /*

  BTC:/home/leon/test # ./a.out

  0xbf905300

  0xbf9052e0

  0xbf9052e1

  0xbf9052e2

  0xbf9052e3

  0xbf9052e4

  0xbf9052e5

  0xbf9052e6

  0xbf9052e7

  0xbf9052e8

  0xbf9052e9

  0xbf9052ea

  0xbf9052eb

  0xbf9052ec

  0xbf9052ed

  0xbf9052ee

  0xbf9052ef

  0xbf9052f0

  0xbf9052f1

  0xbf9052f2

  0xbf9052f3

  0xbf9052f4

  0xbf9052f5

  0xbf9052f6

  0xbf9052f7

  0xbf9052f8

  0xbf9052f9

  0xbf9052fa

  0xbf9052fb

  0xbf9052fc

  0xbf9052fd

  0xbf9052fe

  0xbf9052ff

  0xbf905300

  7

  */

  从结果可以清晰的看到:

  1 进入函数f1()后,栈“向下”生长了。

  2 通过直接访问栈内容,修改了栈内的值。

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

本文已影响868
+1
0