以下方案是否具有未定义的行为?
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.