当试图访问C中的单个字节时,为什么我能够访问该类型范围之外的字节?

时间:2013-09-28 22:45:49

标签: c byte bits

我在C中有一个简单的程序,它允许我访问int的所有字节。我在一台32位机器上。

int x = 1;
unsigned char* bytes = (unsigned char*)&x;  
printf("Value: %d\n", bytes[10000]); 

我不明白为什么最后一行打印99或者甚至是有效的陈述。我机器上的int应该只有4个字节。我假设bytes只允许0-3的键值。

我不理解什么?

1 个答案:

答案 0 :(得分:3)

这不是一个“有效的陈述”,因为它的行为是未定义的。但是,它不是约束违规,因此编译器没有义务(并且不一定能够)在编译时告诉您它是错误的。要知道这是错误的,编译器必须跟踪它指向的内容,虽然这在您的特定示例中很容易,但通常情况下甚至都不可能。

当(在运行时)执行加法bytes+10000(隐含在表达式bytes[10000]中)时,结果行为是未定义的。未定义的行为意味着所有的赌注都关闭了你的程序。它没有义务告知您出现任何问题,也没有表现出您希望的行为。