修改我也有一个 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
仅仅意味着它指向的数据不能被改变。
当您将指针传递给您的函数时,完全由您决定它是否应该是 const
。 const
是一种保护工具,可防止对您的数据进行不必要的更改。但是没有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
修改它(即使两个指针指向相同的位置).
以下场景是否有未定义的行为?
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
仅仅意味着它指向的数据不能被改变。
当您将指针传递给您的函数时,完全由您决定它是否应该是 const
。 const
是一种保护工具,可防止对您的数据进行不必要的更改。但是没有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
修改它(即使两个指针指向相同的位置).