Forum: Compiler & IDEs Frage bzgl. Pointerzuweisung


von pumpkin (Gast)


Lesenswert?

Hallo Forum,

ich stolpere gerade über folgende Codezeile:
1
*( pFIR->p++ ) = sInput;

Die Struktur sieht folgendermaßen aus:
1
typedef struct 
2
{
3
  // ...
4
5
  short *p;
6
7
  // ...
8
} FIRstate;

Meine Frage: Wann wird der Pointer 'p' inkrementiert? Nachdem oder bevor 
dereferenziert|zugewiesen wird? Laut K&R wird der Ausdruck IN den 
Klammern nach Zuweisung inkrementiert, aber mich macht die 
Dereferenzierung stutzig - steh' wohl gerade auf dem Schlauch...

Danke, pumpkin

von Klaus F. (kfalser)


Lesenswert?

Nachher.

von pumpkin (Gast)


Lesenswert?

Dat ging fix. Danke...

pumpkin
1
*( pFIR->p ) = sInput;
2
pFIR->p++;

von Karl H. (kbuchegg)


Lesenswert?

pumpkin wrote:

> Meine Frage: Wann wird der Pointer 'p' inkrementiert? Nachdem oder bevor
> dereferenziert|zugewiesen wird?

Kommt drauf an, wie der Compiler das macht.
Fix ist nur: Wenn die komplette Anweisung abgearbeitet
wurde, dann hat p auf jeden Fall seinen neuen
Wert erhalten.

In einem 'wohlgeformten' C Ausdruck spielt das auch
keine Rolle. Wichtig ist nur, dass für die Dereferenzierung/
Zuweisung der Wert von p vor der Erhöhung benutzt wird.

von Klaus F. (kfalser)


Lesenswert?

Bitte keine Verwirrung stiften.
In dem angegebenen Beispiel wird der Pointer ganz eindeutig nach der 
Zuweisung inkrementiert, das heist der Wert geht an die Stelle an die 
der Pointer vorher gezeigt hat, und nach der Zeile ist der Pointer eine 
Stelle weitergerückt.

Wohlgeformte Antworten antworten nur auf die Frage und nichts mehr ;-)

Klaus

von Karl H. (kbuchegg)


Lesenswert?

Klaus Falser wrote:
> Bitte keine Verwirrung stiften.

Das hat nichts mit Verwirrung zu tun.
Sondern eher mit einer unzulässigen Vereinfachung.

> In dem angegebenen Beispiel wird der Pointer ganz eindeutig nach der
> Zuweisung inkrementiert,

das kannst du nicht wissen.
Der Compiler kann die Erhöhung machen wann er will. Solange
der Prozess vor dem nächsten Sequence Point abgeschlossen
ist, ist den Vorschriften genüge getan.

> das heist der Wert geht an die Stelle an die
> der Pointer vorher gezeigt hat, und nach der Zeile ist der Pointer eine
> Stelle weitergerückt.

Sag ich doch:
Das einzige was fix ist: Es wird der Pointerwert vor
der Inkrementierung für den Zugriff benutzt. Ob der
Pointer zu diesem Zeitpunkt schon inkrementiert ist
oder nicht, entscheidet der Compiler.

von pumpkin (Gast)


Lesenswert?

Alles gut! Ihr müsst jetzt keine Grundsatzdiskusion lostreten wegen 
sowas. ;) Karl seine Ausführungen waren wie immer hilfreich und haben 
zum weiterdenken angeregt. Was VisualDSP++ draus macht werde ich mir 
heute anschauen. Wichtig war fürs Verständnis erstmal das hier: "Es wird 
der Pointerwert vor der Inkrementierung für den Zugriff benutzt.".

pumpkin

von Karl H. (kbuchegg)


Lesenswert?

pumpkin wrote:
> Alles gut! Ihr müsst jetzt keine Grundsatzdiskusion lostreten wegen
> sowas. ;)

Geb ich dir grundsätzlich recht.
Nur: Solche Aussagen führen normalerweise sehr schnell
zu der Frage, warum

   i = 1;
   j = i++ + i++;

auf unterschiedlichen Compilern zu unterschiedlichen
Ergebnissen führt.
Abgesehen von der Regelverletzung, dass ein Wert in einem
Ausdruck nur einmal verändert werden darf, ist es auch
nicht definiert, wann denn jetzt genau das Ergebnis des Inkrements
zurück geschrieben wird. Je nachdem wie der Compiler das macht,
hat i dann (meistens) entweder den Wert 2 oder 3.
Aber um dem vorzubeugen: Der ganze Ausdruck ist natürlich
illegal und hat als solches undefiniertes Verhalten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.