首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >绘制执行代码的图表

绘制执行代码的图表
EN

Stack Overflow用户
提问于 2015-01-15 04:03:41
回答 2查看 121关注 0票数 0

考虑以下几行代码:

代码语言:javascript
运行
复制
char a = 'a';
char b = 'b';
int ai[] = { 1, 2 };
int i = 0;

假设字长是32位,int是32位,并且存储器分配是以与从地址位置68开始的声明相反的顺序进行的。

绘制一个图表,显示执行以下代码行的效果。

代码语言:javascript
运行
复制
 for (i = 0; i < 8; i++)
 *(&a – i) = 'z';

所以我不确定它对我的期望是什么。我最初的猜测是,它循环遍历,本质上是a-1,a-2...a-8,使每个值等于字符Z。所以这个图实际上是8个对象,每个对象都指向Z,每个对象都有与Z相同的地址。我不确定这是正确的还是可怕的错误。有谁愿意解释一下。仅供参考这是一份过去的试卷,为期末考试而练习,不是考试作业!

EN

回答 2

Stack Overflow用户

发布于 2015-01-15 05:09:38

你不能保证这是如何工作的,因为这取决于C编译器如何布局。但是,您可以很容易地确定特定的C编译器是如何做到这一点的。假设是gcc,用-g编译,然后在gdb下运行程序。使用print打印变量(或使用print &x打印变量的地址),使用x检查内存。

票数 2
EN

Stack Overflow用户

发布于 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')

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

感谢投了反对票,无可奉告。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27951447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档