При попытке получить доступ к отдельным байтам в C, почему я могу получить доступ к байтам вне диапазона типа?

У меня есть простая программа на 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 ответ

Решение

Это не "правильное утверждение" в том смысле, что его поведение не определено. Однако это не является нарушением ограничений, и поэтому компилятор не обязан (и не обязательно способен) сообщать вам во время компиляции, что это неправильно. Чтобы знать, что это неправильно, компилятор должен отслеживать, на что он указывает, и хотя это легко для вашего конкретного примера, в общем, это даже невозможно.

Когда (во время выполнения) вы выполняете сложение bytes+10000 (подразумевается в выражении bytes[10000]), результирующее поведение не определено. Неопределенное поведение означает, что все ставки отключены относительно того, что делает ваша программа. Он не обязан информировать вас о том, что что-то пошло не так, или вести себя так, как вы можете надеяться.

Другие вопросы по тегам