【问题标题】:Drawing a diagram of executing code绘制执行代码图
【发布时间】:2015-01-14 20:03:40
【问题描述】:

考虑以下代码行:

char a = 'a';
char b = 'b';
int ai[] = { 1, 2 };
int i = 0;

假设字长是 32 位,一个 int 是 32 位, 内存分配以相反的顺序进行 从地址位置 68 开始的声明。

画出效果图 执行以下代码行。

 for (i = 0; i < 8; i++)
 *(&a – i) = 'z';

所以我很不确定它对我的期望。我最初的猜测是它循环并基本上做 a-1,a-2....,a-8 使每个值都等于字符 Z。所以该图基本上是 8 个对象都指向 Z,每个对象都具有相同的地址为 Z。我不确定这是对还是错。有没有人愿意解释一下。仅供参考,这是一份过去的试卷,为期末练习,而不是考试!

【问题讨论】:

  • 除非我遗漏了什么,否则这会触发未定义的行为 - &a 是 char a 的地址,因此 (&a - 1) 不能被取消引用。
  • “教授”如何能够规定 C 代码运行的顺序?教授说过 int 大小是 32 位,但与 char 大小或对齐无关。
  • 啊,我错过了您定义的分配方式。正确的答案仍然是它是未定义的行为,所以任何事情都可能发生。您的教授想要的答案是内存中四个变量的图表以及哪些字节被 z 覆盖。
  • 即使char这两个变量是32位字对齐的,a的高3字节也会被忽略,循环会部分影响int变量。教授没有提到字节序。所以int 的值是个谜。

标签: c


【解决方案1】:

你不能保证它是如何工作的,因为它是由 C 编译器决定的。但是,您可以轻松地确定特定 C 编译器是如何做到的。假设gcc,用-g编译,然后在gdb下运行程序。使用print 打印变量(或print &amp;x 打印变量地址),使用x 检查内存。

【讨论】:

    【解决方案2】:

    代码很奇怪,因为它没有意义。 据我所知,这会发生:

    我将位于地址 68

    ai 将位于 72 和 76

    困难的部分是a和b。 它们只需要一个字节,但编译器仍可能对它们进行字对齐! 这取决于您的系统/编译器。

    使用单词对齐的选项1:

    b 将在地址 80

    a 将位于地址 84

    选项 2 不使用字对齐:

    b 将在地址 80

    a 将在地址 81

    循环将从用 z 覆盖 a 开始 然后它将地址减一并用 z 覆盖该位置

    这将重复 8 次。

    所以对于选项 1,结果将是 a 和 b 都将是 z,并且一些未使用的内存也将是 z。

    之前的记忆:

    00 00 00 00

    00 00 00 01

    00 00 00 02

    -- -- -- 'b'

    -- -- -- 'a'

    之后的记忆:

    00 00 00 08

    00 00 00 01

    00 00 00 02

    'z' 'z' 'z' 'z'

    'z' 'z' 'z' 'z'

    对于选项 2,a 和 b 都将是 z,但 ai 也将被更改。 ai[1] = int(zzzz) 和 ai[0]=int(zz)

    之前的记忆:

    00 00 00 00

    00 00 00 01

    00 00 00 02

    'b''a'

    之后的记忆:

    00 00 00 08

    00 00 'z' 'z'

    'z''z''z''z'

    'z''z'

    编辑:

    我看到我的回答被否决了。

    也许是因为我忘了说它是针对大端系统的。

    所以我也在windows机器上试了一下,结果如下:

    地址 28fec3

    b 地址 28fec2

    ai 地址 28feb8

    我的地址是 28feb4

    之前

    0 0 0 0 (i=0)

    1 0 0 0 (ai[0]=1)

    2 0 0 0 (ai[1]=2)

    -43 -116 b a(未使用未使用的 b='b' a='a')

    之后

    8 0 0 0 (i=8)

    1 0 0 0 (ai[0]=1)

    z z z (ai[1]=int("zzzz")

    z z z z(未使用未使用的 b='z' a='z')

    由于小端的东西“转身”,但重点是一样的。

    感谢没有评论的反对票。

    【讨论】:

      猜你喜欢
      • 2019-01-31
      • 2013-11-07
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 2016-08-28
      相关资源
      最近更新 更多