0

我有一个简单的 C 语言程序,可以让我访问 int 的所有字节。我在一台 32 位机器上。

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

我不明白为什么最后一行打印出来99,甚至是一个有效的声明。我机器上的一个int应该只有 4 个字节。我假设这bytes只会允许0-3.

我不明白什么?

4

1 回答 1

3

这不是一个“有效的声明”,因为它的行为是未定义的。但是,这不是违反约束,因此编译器没有义务(也不一定能够)在编译时告诉您它是错误的。要知道它是错误的,编译器必须跟踪它指向的内容,尽管在您的特定示例中这很容易,但一般来说,这甚至是不可能的。

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

于 2013-09-28T22:50:01.763 回答