【发布时间】:2015-01-14 20:03:40
【问题描述】:
考虑以下代码行:
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。我不确定这是对还是错。有没有人愿意解释一下。仅供参考,这是一份过去的试卷,为期末练习,而不是考试!
【问题讨论】:
-
除非我遗漏了什么,否则这会触发未定义的行为 - &a 是 char a 的地址,因此 (&a - 1) 不能被取消引用。
-
“教授”如何能够规定 C 代码运行的顺序?教授说过 int 大小是 32 位,但与 char 大小或对齐无关。
-
啊,我错过了您定义的分配方式。正确的答案仍然是它是未定义的行为,所以任何事情都可能发生。您的教授想要的答案是内存中四个变量的图表以及哪些字节被 z 覆盖。
-
即使
char这两个变量是32位字对齐的,a的高3字节也会被忽略,循环会部分影响int变量。教授没有提到字节序。所以int的值是个谜。
标签: c