volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象
下面的函数有什么错误:
- int square(volatile int *ptr)
- {
- return *ptr * *ptr;
- }
- int square(volatile int *ptr)
- {
- int a,b;
- a = *ptr;
- b = *ptr;
- return a * b;
- }
volatile是易变的,防止编译器优化,将直接从内存中取数字。所以
由于*ptr的值可能被意想不到的改变,因此a和b可能是不同的。结果,这段代码可能返不是你所期望的平方值!正确的代码如下:
- long square(volatile int *ptr)
- {
- int a;
- a =*ptr;
- return a * a;
- }