2013-09-28 2 views
0

У меня есть простая программа на C, которая позволит мне получить доступ ко всем байтам int. Я на 32-битной машине.При попытке доступа к отдельным байтам в C, почему я могу получить доступ к байтам вне диапазона типа?

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

Я не понимаю, почему последняя строка печатает 99 или даже действительное утверждение. int на моей машине должен иметь только 4 байта. Я бы предположил, что bytes допустит только ключевые значения 0-3.

Что я не понимаю?

+7

«байты» - это переменная, а не полицейский. Дело не в разрешении или запрете чего-либо. –

ответ

3

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

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

Смежные вопросы