Sagen, ich habe eine StrukturZeiger in einem volatilen struct in C
typedef struct A{
int a1;
int *a2;
}A_t;
Nun, wenn ich eine Instanz dieser Struktur erklären volatil zu sein -
volatile A_t trial;
Und ich verwenden, um einen flüchtigen Zeiger auf Zugang diese flüchtige Struktur.
volatile A_t *ptrToTrial = &trial;
Wenn ich versuche, dies zu tun:
int *ptrToField = ptrToTrial->a2;
Sollte ptrToField
auch flüchtig sein? Wüsste der Compiler, dass prtToField
ohne explizite Erwähnung flüchtig ist, weil auf ihn über ptrToTrial
zugegriffen wird, der flüchtig ist?
Auch wenn es eine Funktion ist -
function trialFunction(A_t *trialptr)
{
int *p = trialptr->a2;
}
Wenn wir diese Funktion mit dem flüchtigen ptr nennen oben erklärt -
trailFunction(ptrToTrial)
Ich erhalte eine Fehlermeldung: volatile A_t* is incompatible with parameter of type A_t
.
Also, wenn ich die Funktionsdefinition ändern, um volatile
einzuschließen, sehe ich keinen Fehler.
function trialFunction(volatile A_t *trialptr)
{
int *p = trialptr->a2;
}
Sollte nicht der Compiler beschweren sich auch über den Zeiger p
- weil p
nicht flüchtig ist und trialptr->a2
ist flüchtig?
Ihr Code macht nicht klar, wie Sie 'volatile' verwenden. Aber sei dir bewusst, dass es nicht das tut, was viele denken. Tatsächlich [ist es in Wirklichkeit praktisch nutzlos] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2016.html). –
Nur Dinge, die im Typspezifizierer explizit als 'flüchtig' deklariert werden, sind flüchtig. In diesem Fall sind 'trial' und' * ptrToTrial' volatil. 'ptrToTrial-> a2' ist flüchtig, da es ein Mitglied einer flüchtigen Struktur ist. Jedoch sind 'ptrToTrial-> a2 [0]' und 'ptrToField [0]' (sofern diese gültig sind) nicht flüchtig. –
"Und ich verwende einen flüchtigen Zeiger, um auf diese flüchtige Struktur zuzugreifen." 'volatile A_t * ptrToTrial = &trial;' -> Nein, 'ptrToTrial' ist nicht 'volatile', was darauf hinweist, ist' volatile'. – chux