关于C关键字的一个令人费解的例子";限制;

关于C关键字的一个令人费解的例子";限制;,c,keyword,restrict,C,Keyword,Restrict,摘自维基百科: void updatePtrs(size_t *restrict ptrA, size_t *restrict ptrB, size_t *restrict val) { *ptrA += *val; *ptrB += *val; } 我在main()中调用此函数: 根据维基百科的描述,val指针不能加载两次,因此j的值应该是10,但实际上是20 我对这个关键词的理解不正确吗?我应该使用一些特定的gcc选项吗 提前感谢。您的代码会导致未定义的行为限制是您向编译器

摘自维基百科:

void updatePtrs(size_t *restrict ptrA, size_t *restrict ptrB, size_t *restrict val)
{
    *ptrA += *val;
    *ptrB += *val;
}
我在
main()
中调用此函数:

根据维基百科的描述,
val
指针不能加载两次,因此
j
的值应该是10,但实际上是20

我对这个关键词的理解不正确吗?我应该使用一些特定的
gcc
选项吗


提前感谢。

您的代码会导致未定义的行为<代码>限制是您向编译器承诺的所有指针参数都指向不同的内存区域

您违反了这个承诺,将
&i
放在其中两个参数上

(事实上,使用
restrict
可以传递重叠指针,但只有在函数中没有通过任何重叠指针进行写入的情况下,才允许传递重叠指针。但通常,如果没有写入操作发生,则不必使用
restrict



FWIW,在我的GCC4.9.2系统上,输出是
j=20
at
-O0
j=10
at
-O1
或更高,这表明编译器确实注意到了
限制
。当然,由于它是未定义的行为,因此结果可能会有所不同。

您的代码会导致未定义的行为<代码>限制是您向编译器承诺的所有指针参数都指向不同的内存区域

您违反了这个承诺,将
&i
放在其中两个参数上

(事实上,使用
restrict
可以传递重叠指针,但只有在函数中没有通过任何重叠指针进行写入的情况下,才允许传递重叠指针。但通常,如果没有写入操作发生,则不必使用
restrict



FWIW,在我的GCC4.9.2系统上,输出是
j=20
at
-O0
j=10
at
-O1
或更高,这表明编译器确实注意到了
限制
。当然,由于这是未定义的行为,您的结果可能会有所不同。

我只想理解这个关键词,所以我违背了承诺。如果在gcc(5.2.1)中使用“-O1”,则得到10。我只是想理解这个关键字,所以我违背了承诺。如果gcc(5.2.1)使用“-O1”,则得到10。
int main(void)
{
    size_t i = 10; 
    size_t j = 0;

    updatePtrs(&i, &j, &i);

    printf("i = %lu\n", i); 
    printf("j = %lu\n", j); 

    return 0;
}