以下代码是未定义的行为,实现是由标准定义还是定义的?我找不到任何关于将整数分配给自己的地址的参考.
volatile int x = (int)&x;
Run Code Online (Sandbox Code Playgroud)
此代码转换为:
lea eax,[ebp-4]
mov dword ptr [ebp-4],eax
Run Code Online (Sandbox Code Playgroud)
oua*_*uah 21
在C中,x在声明和初始化中使用都很好:
(C99,6.2.1p7)"[......]任何其他标识符的范围都在其声明者完成之后开始."
指针转换为整数的结果是实现定义的,可以是未定义的行为:
(C99,6.3.2.3p7)"任何指针类型都可以转换为整数类型.除了先前指定的,结果是实现定义的.如果结果不能用整数类型表示,则行为是未定义的.结果不必在任何整数类型的值范围内."
mas*_*oud 12
在C++中,根据声明规则.它定义明确.因为之前=,变量x被声明然后&x是已知的.这是一个棘手的问题,下面的代码是未定义的行为:
int x = x; // undefined behavior, using uninitialized variable
Run Code Online (Sandbox Code Playgroud)
但...
int x = (int)&x; // defined behavior
Run Code Online (Sandbox Code Playgroud)
我在谈论C++,但我相信它对C也有效.