gpt4 book ai didi

c - 在 C 中使用限制指针时,可以使用其初始标识符更改变量吗?

转载 作者:太空狗 更新时间:2023-10-29 15:25:08 24 4
gpt4 key购买 nike

在 C 中使用 restrict 指针时,是否可以使用其初始 Identifier 更改变量?例如:

int foo = 0;

int * restrict fooPtr = &foo;
++(*fooPtr); // Part 1: foo is 1 (OK)

++foo; // Part 2: foo is 2 (Is this OK?)

int * fooPtr2 = &foo;
++(*fooPtr2); // Part 3: foo is 3 (BAD: You shouldn't access via a second pointer)

...在创建 restrict fooPtr 后,我通过 foo 更改了 foo 的值。

第 1 部分 在我看来还不错。我对第 2 部分感到困惑。根据我对 restrict 的理解,第 3 部分 很糟糕(编译器允许它,但它的行为是未定义的,程序员不能那样做)。

最佳答案

不,第 2 部分不合适。

标准的具体部分是6.7.3.1/4。这部分非常密集,需要重新阅读一些,但是 P 是一个限制指针,X 是它用来访问的某个对象,并且被修改了。因此,在您的示例中,P 是 fooPtr,X 是 foo。然后:

Every other lvalue used to access the value of X shall also have its address based on P.

“基于”在上一段中定义,总而言之,左值 foo 的地址基于限制指针 P。所以规则当你通过它自己的名字访问对象 foo 时被破坏了。

出于完全相同的原因,第 3 部分不正确,左值 *fooPtr2 也不基于 P,但也用于访问 X。

我说“不行”——准确地说,1+2 的组合会引发未定义的行为,1+3 的组合也是如此。只要您实际上不通过限制指针访问对象,限制的定义就不会“启动”。如果你愿意,你可以删除第 1 部分,保留未使用的限制指针,然后 2 和 3 就可以了。

关于c - 在 C 中使用限制指针时,可以使用其初始标识符更改变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3936060/

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