它是一段安全的代码吗,或者编译器可以通过p优化访问,这样*p就会得到42

#include <stdio.h>

int i = 42;
int *d = &i;

void test(int const *p) 
{
    *d = 43;
    printf("%d, %p\n", *p, (void *) p);
    printf("%d, %p\n", *d, (void *) d);
}

int main() {
    test(d);
    return 0;
}

我发现*p通常在43中打印,但我想知道这里是否有任何trap ,所以在某些情况下,打印*p可以得到42.

推荐答案

这是一段安全的代码吗?或者编译器是否可以通过p优化访问,从而使*p得到42?

很安全.

如果这里有任何trap ,那么在某些情况下,打印*p可能会产生42.

不是的.

如果编译器应用了这样的优化,它必须知道您正在修改一个全局变量,该变量可能会通过另一个指针产生别名,并且必须在每次访问时重新计算结果.const指针仅表示您不能使用that指针修改内存.您可以考虑研究C编程语言中的restrict关键字和别名.

C++相关问答推荐

ARM上的Modulo Sim Aarch 64(NEON)

是否可以在C中进行D3 D12申请?

为什么静态说明符为内联函数生成外部定义?

在Windows上构建无聊的SSL x64

strftime函数中%s的历史意义是什么?为什么没有记录?

堆栈在作用域阻塞后会被释放吗?

Clang:如何强制运行时错误的崩溃/异常由于-fsanitize=undefined

如何在CANbus RX/TX FIFO起始地址寄存器(ATSAME 51)的特定地址初始化数组?

在创建动态泛型数组时,通过realloc对故障进行分段

C指针概念分段故障

添加函数会 destruct 嵌入式C代码(无IDE)

覆盖读取函数,但当文件描述符为3或4时,我有问题

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

为什么Linux无法映射这个PT_LOAD ELF段?

将 struct 数组写入二进制文件时发生Valgrind错误

在下面的C程序中,.Ap0是如何解释的?

存储和访问指向 struct 的指针数组

在分配内存后使用指针是未定义的行为吗?

C 中从 Unix 纪元时间转换的损坏

如何让 unlinkat(dir_fd, ".", AT_REMOVEDIR) 工作?