绘制执行代码的图表

时间:2015-01-14 20:03:41

标签: c

考虑以下代码行:

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.我不确定这是正确的还是可怕的错误。任何人都可以解释。仅供参考,这是一篇过去的考试试卷,专攻决赛,而不是考试工作!

2 个答案:

答案 0 :(得分:2)

你无法保证这是如何工作的,因为它取决于C编译器如何解决问题。但是,您可以轻松确定特定 C编译器如何执行此操作。假设gcc,使用-g进行编译,然后在gdb下运行该程序。使用print打印变量(或print &x打印变量的地址),使用x检查内存。

答案 1 :(得分:1)

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

我将位于地址68

ai将位于72和76

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

选项1使用单词对齐:

b将在地址80

a将在地址84

选项2不使用单词对齐:

b将在地址80

a将在地址81

循环将通过用z覆盖a来开始 然后它将地址递减1并用z

覆盖该位置

这将重复8次。

因此,对于选项1,结果将是a和b都将是z,而一些未使用的内存也将是z。

记忆之前:

<00> 00 00 00 00

00 00 00 01

<00> 00 00 00 02

- - - &#39; b&#39;

- - - &#39; a&#39;

后记忆:

<00> 00 00 00 08

00 00 00 01

<00> 00 00 00 02

&#39; Z&#39; &#39; Z&#39; &#39; Z&#39; &#39; Z&#39;

&#39; Z&#39; &#39; Z&#39; &#39; Z&#39; &#39; Z&#39;

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

记忆之前:

<00> 00 00 00 00

00 00 00 01

<00> 00 00 00 02

&#39; B&#39; &#39;一个&#39;

后记忆:

<00> 00 00 00 08

<00> 00 00&#39; z&#39; &#39; Z&#39;

&#39; Z&#39; &#39; Z&#39; &#39; Z&#39; &#39; Z&#39;

&#39; Z&#39; &#39; Z&#39;

编辑:

我看到我的答案被投了票。

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

所以我在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 =&#39; b&#39; a =&#39; a&#39;)

8 0 0 0(i = 8)

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

z z z z(ai [1] = int(&#34; zzzz&#34;)

z z z z(未使用的未使用的b =&#39; z&#39; a =&#39; z&#39;)

由于小的东西和#34;转过来&#34;但重点是相同的。

感谢您的投票结果不予置评。