C语言中的以下代码是否具有已定义的行为?从const指针中删除const是否遵守C中的严格别名,并引用同一个对象?
int main() {
const int i = 0;
return *(int*)(&i);
}
我问,因为6.5/7列出为一个有效的别名“与有效对象的类型兼容的类型的合格版本”。但对象的有效类型是const int
,我不认为int
是const int
的合格版本(尽管情况正好相反)。 int
和const int
兼容(6.7.3/10)。
此外,6.3.2.3/2表示可以通过将指针类型转换为限定符,并且生成的指针是相等的。 6.3.2.3/7说你可以转换任何两种指针类型(所以铸造(int*)(&i)
本身是允许的)。但并不是说所产生的指针指向的是同一个对象,或者说它是平等的。它所说的是它可以转换回原来的类型(在这种情况下为const int*
)。也就是说,即使别名是合法的,我也不清楚标准是否保证了我的指针转换确实会产生一个指向i
的指针。
那么,标准实际上是否定义了我的代码的行为,如果是这样定义的呢?
我知道代码在实践中的作品。我想到了一个假想的(和奇怪的)实现,它不起作用。我可以问这个实现是否符合标准(如果没有,它违反了什么部分),但是如果我的想象实现不符合其他方面,我不想浑水。如果有人认为它会帮助他们回答这个问题,我会描述实施情况。
对于转换回int const *标准清楚地表明结果必须是标识。 “否则,当再次转换时,结果应与原始指针相等。” –
@JensGustedt:同意。这对我的代码没有帮助,因为我的代码永远不会将它转换回'int const *'。 –