Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
我有一个简单的 C 语言程序,可以让我访问 int 的所有字节。我在一台 32 位机器上。
int x = 1; unsigned char* bytes = (unsigned char*)&x; printf("Value: %d\n", bytes[10000]);
我不明白为什么最后一行打印出来99,甚至是一个有效的声明。我机器上的一个int应该只有 4 个字节。我假设这bytes只会允许0-3.
99
int
bytes
0-3
我不明白什么?
这不是一个“有效的声明”,因为它的行为是未定义的。但是,这不是违反约束,因此编译器没有义务(也不一定能够)在编译时告诉您它是错误的。要知道它是错误的,编译器必须跟踪它指向的内容,尽管在您的特定示例中这很容易,但一般来说,这甚至是不可能的。
当(在运行时)您执行加法bytes+10000(在表达式中隐含bytes[10000])时,结果行为是未定义的。未定义的行为意味着所有赌注都与您的程序所做的有关。它没有义务通知您出现任何问题,也没有义务按照您希望的方式行事。
bytes+10000
bytes[10000]