我是 C 初学者,我遇到了以下代码:
#include "stdio.h"
unsigned int ReturnSquare(void);
int main(void) {
int k;
int *mPtr;
mPtr = (int*) 0x1234;
*mPtr = 10;
k = (int) ReturnSquare();
printf("%p --> %d\n",mPtr,k);
}
unsigned int ReturnSquare(void)
{
unsigned volatile int a = * (unsigned volatile int *) 0x1234;
unsigned volatile int b = * (unsigned volatile int *) 0x1234;
return a * b;
}
您能帮我理解一下这段代码中 volatile 的用途吗?
程序似乎无法正常运行。非常欢迎任何建议和解释。预先感谢您。
最佳答案
当您两次读取同一寄存器时,编译器可以决定优化行为。
它可以将代码变成这样:
unsigned int a = * (unsigned int *) 0x1234;
unsigned int b = a;
当您添加 volatile 时,编译器不会在第二次读取时假设该值将相同,并且它将生成额外的指令以取消引用指针以再次注册。
现在对您来说可能太先进,但您可以使用编译器上的汇编输出选项来检查这一点, volatile 版本将有更多汇编指令。
关于c - C 中 volatile 关键字的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52273459/