请让您的老师为您解释这个问题。
我不确定这个方法是否适用于您的系统,但在数组a
之后使用未清零字节的内存进行操作会使a[27][27]
的结果不同。
在我的系统上,当我打印a[27][27]
的内容时,它是0xFFFFFFFF
。也就是说,将-1转换为无符号数在二进制补码中表示为所有位均设置。
#include <stdio.h>
#include <string.h>
#define printer(expr) { printf(#expr" = %u\n", expr); }
unsigned int d[8096];
int a[4][4];
unsigned int b[8096];
unsigned int c[8096];
int main() {
memset(b, -1, 8096*4);
memset(c, -1, 8096*4);
memset(d, -1, 8096*4);
printer(a[0][0]);
printer(a[3][3]);
printer(a[27][27]);
return 0;
}
这是我的输出结果:
a[0][0] = 0
a[3][3] = 0
a[27][27] = 4294967295
我在评论中看到了有关在Visual Studio中查看内存的内容。最简单的方法是在代码中添加断点(以停止执行),然后进入“调试”...“窗口”...“内存”菜单,选择例如“内存1”。然后您可以找到数组
a
的内存地址。在我的情况下,地址为
0x0130EFC0
。因此,您需要在地址栏中输入
0x0130EFC0
并按Enter键。这将显示该位置处的内存。
例如,在我的情况下。
0x0130EFC0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ..................................
0x0130EFE2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ff ff ff ..............................ÿÿÿÿ
0x0130F004 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
0x0130F026 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
0x0130F048 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
零当然是数组a中的元素,它的字节大小为4 x 4 x int的sizeof
(在我的情况下为4) = 64个字节。地址0x0130EFC0处的字节内容均为0xFF(来自b、c或d的内容)。
注意:
0x130EFC0 + 64 = 0x130EFC0 + 0x40 = 130F000
这个问题指的是你所看到的所有ff
字节的开始。很可能是数组b
。
a[27][270]
怎么样?”、“a[270][270]
呢?” - axioma[27][27]
恰好因为偶然性而为0,且a
是全局变量或静态变量,则你得到0的概率很高,因为所有全局和静态变量在程序启动前都会被初始化为0。如果在a
之后还有更多的全局/静态变量,那么a[27][27]
只是这些变量中的一个。但基本上这是未定义行为。 - Jabberwocky