【发布时间】:2016-06-22 14:39:43
【问题描述】:
假设我有一个结构
typedef struct A{
int a1;
int *a2;
}A_t;
现在如果我声明这个结构的一个实例是 volatile -
volatile A_t trial;
我使用 volatile 指针来访问这个 volatile 结构。
volatile A_t *ptrToTrial = &trial;
如果我尝试这样做:
int *ptrToField = ptrToTrial->a2;
ptrToField 也应该是易变的吗?编译器是否会知道 prtToField 是 volatile 而没有明确提及,因为它是通过 volatile 的 ptrToTrial 访问的?
还有如果有函数的话-
function trialFunction(A_t *trialptr)
{
int *p = trialptr->a2;
}
如果我们用上面声明的 volatile ptr 调用这个函数 -
trailFunction(ptrToTrial)
我收到一个错误:volatile A_t* is incompatible with parameter of type A_t。
因此,如果我将函数定义更改为包含volatile,我不会看到错误。
function trialFunction(volatile A_t *trialptr)
{
int *p = trialptr->a2;
}
编译器不应该也抱怨指针p - 因为p 是非易失性的而trialptr->a2 是易失性的吗?
【问题讨论】:
-
您的代码并不清楚您如何使用
volatile。但请注意,它并没有像许多人认为的那样做。其实it's all but useless in actuality. -
只有在类型说明符中明确声明为
volatile的东西才会是易变的。在上述情况下,trial和*ptrToTrial是易失的。ptrToTrial->a2是 volatile 的,因为它是 volatile 结构的成员。但是ptrToTrial->a2[0]和ptrToField[0](假设它们是有效的)不是易失性的。 -
"我使用一个 volatile 指针来访问这个 volatile 结构。"
volatile A_t *ptrToTrial = &trial;--> 不,ptrToTrial不是volatile,它指向的是volatile。