gpt4 book ai didi

c - 从指向 const 的指针中删除 const 是否遵循 C 中的严格别名,并引用同一个对象?

转载 作者:太空狗 更新时间:2023-10-29 16:36:21 24 4
gpt4 key购买 nike

C 中的以下代码是否具有已定义的行为?

int main() {
const int i = 0;
return *(int*)(&i);
}

我问是因为 6.5/7 将“与对象的有效类型兼容的类型的合格版本”列为有效别名。但是对象的有效类型是const int,我不认为intconst int的合格版本(虽然反过来是真的)。 intconst int 都不兼容 (6.7.3/10)。

此外,6.3.2.3/2 说您可以通过添加 限定符来转换指针类型,并且生成的指针是相等的。 6.3.2.3/7 表示您可以转换任意两种指针类型(因此允许转换 (int*)(&i) 本身)。但并没有说结果指针指的是同一个对象,甚至是相等的。它只是说它可以转换回原始类型(在本例中为 const int*)。也就是说,即使别名是合法的,我也不清楚标准是否保证我的指针转换确实会导致指向 i 的指针。

那么,该标准是否真的定义了我的代码的行为,如果是,它是在哪里定义的?

我知道代码在实践中有效。我想到了一个假设的(奇怪的)实现,它在上面不起作用。我可以问该实现是否符合标准(如果不符合,它违反了哪一部分),但如果还有其他方面我想象的实现不符合,我不想混淆水域。如果有人认为这有助于他们回答问题,我将描述实现。

最佳答案

根据 §6.7.3 p5,至少暗示它有效:

If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined. If an attempt is made to refer to an object defined with a volatile-qualified type through use of an lvalue with non-volatile-qualified type, the behavior is undefined.

请注意,对于 volatile 限定类型,它表示 refer to,但对于 const 限定类型,它只是表示 modify,这意味着非修改访问是可以的(“证明规则的异常”)。

不过,在我看来,您可能发现了标准中的缺陷。

关于c - 从指向 const 的指针中删除 const 是否遵循 C 中的严格别名,并引用同一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14437699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com