可以安全地读取C中未初始化的自动易失性变量吗?

ano*_*nol 3 c volatile undefined-behavior

在C中,我可以访问自动volatile变量而不必先进行初始化,还是总是导致未定义的行为?

例如,在映射到volatile变量的一些硬件设备中,初始化变量无论如何都没有意义,甚至可能被禁止.

Bas*_*tch 6

自动变量通常在调用堆栈上(但这是特定于实现的),因此它通常不会是某些特定于硬件的"设备"(除非您的堆栈指针是垃圾).在这种情况下(在堆栈上),变量继承自该堆栈位置的先前内容.如果它是易变的,例如,像

void foo(void) {
  volatile int x;
  // here x contains garbage
}
Run Code Online (Sandbox Code Playgroud)

访问它x会产生一些"不确定的值",并且该访问是一种未定义的行为.

C标准不需要任何调用堆栈,但大多数C实现使用机器调用堆栈.

当然,如果你有一个自动变量,它是一个指向一些易失数据的指针,情况会有所不同.

  • @unwind声明一个指针,例如`volatile int*ptr;`但不会使_pointer variable_ volatile变为.它仍然是一个普通的自动存储变量(假设它是在本地范围内声明的).为了使实际指针易变,你必须编写一些模糊的东西,比如`int*volatile ptr;`.为什么有人会这样做,我不知道. (2认同)