修改我也有一个 const 指针指向的值是否是未定义的行为

Is it undefined behavior to modify a value that I also have a const pointer pointing to

以下场景是否有未定义的行为?

void do_stuff(const int *const_pointer, int *pointer) {
    printf("%i\n", *const_pointer);
    *pointer = 1;
}

int data = 0;
do_stuff(&data, &data);

如果这是未定义的行为,如果编译器假定 const_pointer 指向的值永远不会改变,则可能会导致问题。在这种情况下,它可能会重新排序 do_stuff 中的两条指令,从而将行为从预期的 printf("0") 更改为 printf("1")

如果编译器可以证明指向const 的指针指向的值指针不会改变,那么它就不需要重新加载值,也不需要保持顺序。

在这种情况下,这是无法做到的,因为这两个指针可能存在别名,所以编译器不能假设这两个指针不指向同一个对象。 (对函数的调用可能是从不同的翻译单元完成的,编译器不知道传递给函数的是什么。)

您的示例中没有未定义的行为,并且可以保证 printf 将输出 0.

一个const_pointer仅仅意味着它指向的数据不能被改变。

当您将指针传递给您的函数时,完全由您决定它是否应该是 constconst 是一种保护工具,可防止对您的数据进行不必要的更改。但是没有const,一个函数仍然可以工作。例如,您的 自己的 版本的 strcpy 可以写成:

strcpy( char *s, const char *t );

或者,

strcpy( char *s, char *t ); // without const, still work, just not as good as the first version

所以你的代码中应该没有任何意外:你不能通过 const_pointer 修改数据,但你可以通过 pointer 修改它(即使两个指针指向相同的位置).