присвоение указателя переменной - PullRequest
2 голосов
/ 01 февраля 2012

addr - это параметр функции, а read_value - локальная переменная функции.оба типа int.

Тогда что значит:

read_value = (* (int *) (addr))

?

Ответы [ 3 ]

4 голосов
/ 01 февраля 2012

(int *) (addr) преобразует числовое значение addr в указатель int *. Если не предпринимаются особые меры, эта операция небезопасна, поскольку произвольное значение addr может нарушать требования выравнивания для int. В общем случае, если значение addr не кратно размеру int, это может привести к неправильному чтению, что в итоге может привести к сигналу SIGBUS.

Звездочка, наконец, получает значение int, расположенное по этому адресу (называемое разыменованием), и сохраняет его в read_value. Именно в этот момент может произойти неправильное чтение, если адрес недостаточно выровнен. Разыменование может также вызвать ошибку сегментации, если адрес окажется ограниченным или защищенным.

Я бы фактически объявил, что addr относится к типу uintptr_t, а не int, поскольку это обеспечивает большую безопасность между приведением к int *. uintptr_t должен соответствовать размеру и представлению указателя, в то время как тип int семантически не связан с указателем.

1 голос
/ 01 февраля 2012

Возьмите следующий пример:

int read_value = 0;
int address = 0x1234;

read_value = *(int *) address;

Это эквивалентно:

read_value = *(int *) 0x1234;

, это читает int по адресу 0x1234 и сохраняет его в read_value объекте,Для этого сначала нужно преобразовать значение int 0x1234 в указатель на int, а затем разыменовать указатель для доступа к значению int, на которое указано.

Обратите внимание, что преобразование (int *) 0x1234 определяется реализацией.

(C99, 6.3.2.3p5) "Целое число может быть преобразовано в любой тип указателя. За исключением указанного ранее,результат определяется реализацией, может быть неправильно выровнен, может не указывать на объект ссылочного типа и может быть представлением прерывания. "

И разыменование указателя - неопределенное поведениеесли это неверный указатель или если он не имеет правильного выравнивания.Любое использование недопустимого указателя является неопределенным поведением.Недопустимый указатель - это указатель, который не является нулевым, но не указывает на надлежащий объект или функцию.

1 голос
/ 01 февраля 2012

Вы приводите addr к указателю на int, разыменовываете его и помещаете в read_value.

Если addr действительно int, я думаю, что это неопределенное поведение.

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