Подтвердить что ты не робот

Присвоение собственного собственного значения его значению

Является ли следующий код undefined поведение, реализация определена или определена стандартом? Я не мог найти ссылки на назначение целого числа по его собственному адресу.

volatile int x = (int)&x;

Этот код переводится на:

lea         eax,[ebp-4]  
mov         dword ptr [ebp-4],eax 
4b9b3361

Ответ 1

В C, используя x как в объявлении, так и в инициализации в порядке:

(C99, 6.2.1p7) "[...] Любой другой идентификатор имеет область действия, которая начинается сразу после завершения его декларатора."

Результат преобразования указателя на целое определяется реализацией и может быть undefined поведением:

(C99, 6.3.2.3p7) "Любой тип указателя может быть преобразован в целочисленный тип. За исключением того, что указано ранее, результат определяется реализацией. Если результат не может быть представлен в целочисленном типе, поведение undefined. Результат не должен находиться в диапазоне значений любого целочисленного типа."

Ответ 2

В С++, в соответствии с пунктом правила объявления. Это хорошо определено. Поскольку перед = объявлена ​​переменная x, а затем &x. Вот сложная точка, ниже кода undefined поведение:

int x = x;        // undefined behavior, using uninitialized variable

но...

int x = (int)&x;  // defined behavior

Я говорю о С++, но я считаю, что он действителен и для C.

Ответ 3

В показанном ASM-коде значение указателя сначала помещается в eax, а затем указатель считывается из eax и помещается в то же место, что и значение целого.

Единственная проблема здесь в том, что int не всегда имеет тот же размер, что и int*. На моей 64-битной машине int - 4 байта, а указатели - 8 байтов. Если бы я запустил ваш код в своем ящике, я бы получил только половину указателя.