考虑以下代码行:

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

假设字长为32位,整数为32位,并且内存分配以与声明从地址位置68开始的相反顺序进行。

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

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

所以我不确定在这里对我有什么期望。 我最初的猜测是它循环遍历,基本上执行a-1,a-2 ....,a-8,使每个值都等于字符Z。因此,该图实际上是8个对象,所有指向Z的对象均具有相同的值地址为Z。我不确定这是对还是错。 任何人都可以解释。 仅供参考,这是过去的考试卷,为期末考试而练习,而不是考试工作!

#1楼 票数:2

您不能保证它的工作方式,这取决于C编译器如何布置。 但是,您可以轻松地建立特定的 C编译器的工作方式。 假设使用gcc ,请使用-g编译,然后在gdb下运行该程序。 使用print来打印变量(或使用print &x来打印变量的地址),并使用x来检查内存。

#2楼 票数:1

该代码很奇怪,因为没有任何意义。 据我所知,这将发生:

我将位于地址68

ai将位于72和76

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

选项1使用单词对齐:

b将在地址80

一个将在地址84

选项2不使用单词对齐:

b将在地址80

一个将在地址81

循环将以a覆盖a开始,然后将地址减1并以z覆盖该位置

这将重复8次。

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

记忆之前:

00 00 00 00

00 00 00 01

00 00 00 02

---'b'

- - - '一种'

记忆后:

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 ba(未使用的未使用b ='b'a ='a')

8 0 0 0(i = 8)

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

zzzz(ai [1] = int(“ zzzz”)

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

由于字节序很少,因此“转身”,但要点是相同的。

感谢您的不赞成评论。

  ask by efwfef translate from so

未解决问题?本站智能推荐:

3回复

如何从此代码绘制控制流图?

如何从此代码绘制控制流图? 如果有人可以展示这个过程,我将不胜感激。 我能够从一个非常简单的案例中绘制 CFG,但我无法做到这一点。 我还需要确定基本路径和多条件标准的测试。 这不是一个家庭作业问题,我只是试图理解课程材料。 谢谢。
1回复

使用cppDepend绘制C源代码的调用图

我在使用cppDepend工具时遇到问题。 我有一个用C语言编写的源代码,我需要绘制其依赖关系或调用图。 cppDepend的编译器的源代码扩展名设置为c; cpp; cxx; cc,但是当我想在C中打开源代码时,文件选择器框仅允许我选择C ++中的源代码。 我该怎么办????
2回复

图绘制算法

我通过这样的顶点邻接关系在母体上有一个无向图。 我想在坐标系上绘制此图。 通过任何方法(力导向,弹簧vs)给出每个顶点位置(x,y)的算法是什么? 我只问伪代码,不问要绘制的任何库或软件。 谢谢。
2回复

如何绘制涉及从文本文件打开并读取它们的代码流程图

像这样的代码 这些符号听起来太相似,无法区分其功能,任何人都可以通过任何方法帮助我,或者根据此网站使用形状名称http://www.breezetree.com/article-excel-flowchart-shapes.htm
1回复

为什么不执行此代码?

我目前正在制作自己的Shell程序。 我必须保留用户输入的最后10条命令的历史记录。 每当用户输入不是常规命令的命令(例如,history,hi,fakecommand等)时,该命令就会被放入历史记录中。 但是,只要用户输入真实命令(例如ls,ps,top,cat等),它就不会添加到历史记
1回复

为什么不能执行此代码?

我正在使用链表进行图形插入。 下面的代码按预期工作正常。 但是,如果我在printGraph函数中更新以下更改,则代码将导致Runtime Error 。 以下行是我无法解决的主要问题:为什么此行会导致代码导致运行时错误? 使用的PS编译器为GCC 6.3 。
2回复

用数组在C中绘制轨迹图

第一次发布问题-希望我能树立良好的声誉! 标题几乎描述了我的工作性质: 用户输入弹丸的初始速度和发射角后,我的程序必须生成点并绘制弹丸轨迹图。 为此,我必须使用两个2D数组-一个用于生成的点,另一个用于画布(基本上是一个40x80的空格填充的空数组)。 为我提供了必须使用的
1回复

在C中基于stdin绘制#的垂直图

我编写了一个程序,该程序从stdin读取整数值,并用一个或多个空格或换行符分隔,直到达到EOF。 输入将包含不超过80个值。 在标准输出上,我想使用#字符从左到右按输入值创建一个简单的垂直柱形图。 每列中打印的哈希数等于相应的输入值。 完成的列上方的区域填充有空格字符。 到