考虑以下几行代码:
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相同的地址。我不确定这是正确的还是可怕的错误。有谁愿意解释一下。仅供参考这是一份过去的试卷,为期末考试而练习,不是考试作业!
发布于 2015-01-15 05:09:38
你不能保证这是如何工作的,因为这取决于C编译器如何布局。但是,您可以很容易地确定特定的C编译器是如何做到这一点的。假设是gcc
,用-g
编译,然后在gdb
下运行程序。使用print
打印变量(或使用print &x
打印变量的地址),使用x
检查内存。
发布于 2015-01-15 05:08:31
这段代码非常奇怪,因为它毫无意义。据我所知,这将会发生:
我会在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 01
00 00 00 02
- 'b‘
- 'a‘
以下时间后的内存:
00 00 00 08
00 00 00 01
00 00 00 02
“z”“z”
“z”“z”
对于选项2,a和b都将是z,但ai也将改变。ai1 =int(Zz)和ai=int(zz)
之前的记忆:
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”
编辑:
我看到我的答案被投票否决了。
也许是因为我忘了告诉你它是为大端系统准备的。
因此,我也在windows机器上尝试了该程序,并得到了以下结果:
A地址28fe3
B地址28fe2
ai地址28feb8
地址: 28feb4
在此之前
0 0 0 (i=0)
1 0 0 0 (ai=1)
2 0 0 0 (ai1=2)
-43 -116 b a(未使用未使用b='b‘a='a')
之后
8 0 0 0 (i=8)
1 0 0 0 (ai=1)
Z (ai1=int("zzzz") )
Z(未使用未使用b='z‘a='z')
由于小端的东西“翻身”,但要点是一样的。
感谢投了反对票,无可奉告。
https://stackoverflow.com/questions/27951447
复制相似问题