При попытке получить доступ к отдельным байтам в 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]
), результирующее поведение не определено. Неопределенное поведение означает, что все ставки отключены относительно того, что делает ваша программа. Он не обязан информировать вас о том, что что-то пошло не так, или вести себя так, как вы можете надеяться.