Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

Присвоить адрес локальной переменной самой себе

#cpp


Требуется получить адрес локальной переменной, и сохранить его в эту же переменную.
Корректен ли такой код:

void* p = (void*) &p;


GCC переваривает нормально.
Возможен ли здесь UB или нарушение strict aliasing?

А также в таком варианте:

int* p = (int*) &p;


ideone
    


Ответы

Ответ 1



Код для void* корректен т.к. тип void** приводится к void*. Код int* p = (int*) &p; сам по себе корректен, т.к. хотя &p имеет тип int**, но его можно привести к int* через reinterpret_cast (C-style cast в данном случае). Однако разыменовывать p нельзя, т.к. это будет нарушением правил alising'а: p фактически указывает на объект с типом int*, а выражение *p трактует этот объект как int. (И конечно же результат такого reinterpret_cast нельзя разыменовать из за правил самого reinterpret_cast, но вопрос был про aliasing.)

Комментариев нет:

Отправить комментарий