Что делает этот код? Включает массивы символов и указатели (C ++) - PullRequest
0 голосов
/ 01 марта 2012
unsigned char myArray[10];

myArray[0] = 0;
myArray[1] = 0;
myArray[2] = 0;
myArray[3] = 22;

cout << *((int *) (myArray)) << endl;

Мне показали этот код в классе, но он не очень хорошо объяснялся. Я определил, что вывод равен (256 ^ 3) * 22, но я не знаю, почему это то, что он печатает. Кто-нибудь может мне это объяснить?

Ответы [ 2 ]

3 голосов
/ 01 марта 2012

Этот код небезопасен и непереносим.

Он (очевидно) хранит значения 0, 0, 0 и 22 в первых 4 элементах myArray, каждый из которых представляет собой unsigned char (один байт).

Выражение myArray - это имя массива, которое в большинстве случаев (включая этот) «распадается» на указатель на первый элемент массива типа unsigned char*.Приведение преобразует unsigned char* в int*, и оператор * распознает этот указатель, получая результат int.

Так что *((int *) (myArray)) занимает первые 4 байта myArray и интерпретирует их как объект int.

С этим связано как минимум 3 проблемы.

  1. Нет гарантии, что myArray правильно выровнен дляint объект. вероятно есть, но если это не так, поведение не определено;Вы могли получить ошибку шины, или неправильный результат, или что-то еще вообще.(Процессоры x86 не очень разборчивы в выравнивании, но в других системах это так.)
  2. Нет гарантии, что sizeof (int) == 4.Если int равен 8 байтам, он будет интерпретировать первые 8 байтов myArray как int - и 4 из этих байтов являются мусором.
  3. Представлениеint может варьироваться.Основная проблема - порядок байтов.Если предположить, что ничего не идет не так, результат может быть либо 256 3 * 22, либо 22 - или даже что-то еще.
2 голосов
/ 01 марта 2012

Последняя строка повторно интерпретирует адрес myArray как указатель на int, разыменовывает его и печатает его.В 32-разрядных системах int имеет длину четыре байта, поэтому значения myArray[0] через myArray[3] интерпретируются как int.Воспринимаемое значение int зависит от порядка байтов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...