www.mikrocontroller.net

Forum: Compiler & IDEs Frage bzgl. Pointerzuweisung


Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

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

Die Struktur sieht folgendermaßen aus:
typedef struct 
{
  // ...

  short *p;

  // ...
} 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

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachher.

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dat ging fix. Danke...

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.