考虑以下代码行:
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.我不确定这是正确的还是可怕的错误。任何人都可以解释。仅供参考,这是一篇过去的考试试卷,专攻决赛,而不是考试工作!
答案 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 0000 00 00 01
<00> 00 00 00 02- - - &#39; b&#39;
- - - &#39; a&#39;
后记忆:
<00> 00 00 00 0800 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 0000 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;但重点是相同的。
感谢您的投票结果不予置评。