我在C中有一个简单的程序,它允许我访问int的所有字节。我在一台32位机器上。
int x = 1;
unsigned char* bytes = (unsigned char*)&x;
printf("Value: %d\n", bytes[10000]);
我不明白为什么最后一行打印99
或者甚至是有效的陈述。我机器上的int
应该只有4个字节。我假设bytes
只允许0-3
的键值。
我不理解什么?
答案 0 :(得分:3)
这不是一个“有效的陈述”,因为它的行为是未定义的。但是,它不是约束违规,因此编译器没有义务(并且不一定能够)在编译时告诉您它是错误的。要知道这是错误的,编译器必须跟踪它指向的内容,虽然这在您的特定示例中很容易,但通常情况下甚至都不可能。
当(在运行时)执行加法bytes+10000
(隐含在表达式bytes[10000]
中)时,结果行为是未定义的。未定义的行为意味着所有的赌注都关闭了你的程序。它没有义务告知您出现任何问题,也没有表现出您希望的行为。