【发布时间】:2009-09-26 19:23:53
【问题描述】:
当我编译以下代码时,它显示 y 和数组的开头相距 60 个单位。但根据我的计算,它应该是 4 * 10(对于数组)+ 4(对于 k)+ 4(对于 y)= 48。 数组 [12] = 17 也被分配给元素 12,因为没有元素 12,所以实现应该转到 y 并用 17 覆盖 y。但是控制台打印 y = 10 代替......我真的很困惑......请帮助!
#include <stdio.h>
int main(void) {
int x = 42;
int y = 10;
int k = 10;
int array[10];
array[12] = 17;
printf("array starts at %d\n", &array[0]);
printf("x has the value %d\n", x);
printf("x is stored in location %d\n", &x);
printf("y has the value %d\n", y);
printf("y is stored in location %d\n", &y);
}
【问题讨论】:
-
不要把时间浪费在探索未定义的行为上。并且不要将时间浪费在利用您的发现结果上。它永远不会有回报。真的。
-
我同意你的观点,但这将在考试中进行测试......叹息......
-
打印数字为无符号 %u。请参阅下面的解释
-
所以你应该知道未定义的行为?可怜的你。另一方面,在这种情况下你不能完全错——一些奇怪平台上的一些奇怪的编译器会产生非常奇怪的结果:)
-
无符号是不够的。在某些计算机上(例如我现在使用的计算机),地址是 64 位,而整数(包括无符号数)是 32 位。 unsigned long 通常足够好,但正确的方法是先转换为 void*,然后使用 %p 打印。