Forum: PC-Programmierung Anfängerproblem mit C


von Holger (holger_p2)


Lesenswert?

Hallo,

ich bin blutiger Anfänger in C und habe gleich ein Verständnis Problem
1
void fn1(int *j){
2
int i;
3
i = *j;  // i ist 123 ok
4
*j = *j + 1; // der inhalt der Speicherstelle auf die j zeigt + 1 ok
5
i = *j;  // i ist 124 ok
6
j++;  // adresse +4 ok
7
*j++; // adresse +4 warum?
8
i = *j;  // i ist irgendwas ok
9
}
10
11
int main(void) {
12
  int k=123;
13
  fn1(&k);
14
  return 0;
15
}

Warum wird bei *j++ die Adresse erhöht und nicht der Inhalt der 
Speicherstelle?

Danke im voraus

von Hans W. (hanswieland)


Lesenswert?

Holger schrieb:
> Warum wird bei *j++ die Adresse erhöht und nicht der Inhalt der
> Speicherstelle?

Weil ++ eine höhere Rangfolge als * hat.
https://de.wikibooks.org/wiki/C-Programmierung:_Liste_der_Operatoren_nach_Priorit%C3%A4t

von Michael B. (laberkopp)


Lesenswert?

Holger schrieb:
> Warum wird bei *j++ die Adresse erhöht und nicht der Inhalt der
> Speicherstelle?

(*j)++;

Adresse um 4 erhöhen weil dein int 4 byte gross ist und +1 zum nächsten 
int führen soll (den es hier nicht gibt).

von Holger (holger_p2)


Lesenswert?

(*j)++;
getestet und funktioniert.

Danke für die schnelle Antwort

von Rolf (rolf22)


Lesenswert?

Holger schrieb:
> (*j)++;
> getestet und funktioniert.

Am besten gewöhnst du dir unnötig klammernsparende Schreibweisen gar 
nicht erst an. Wenn du nicht tagtäglich immer nur programmierst, 
unterlaufen dir sonst leicht mal Fehler. Oder du verlierst Zeit, weil du 
beim Suchen von (anderen) Fehlern immer wieder mal 
überlegen/nachschlagen musst, ob nicht diese Schreibweise der gesuchte 
Fehler ist.

Stichwort: Defensive Codierung.

Der Compiler übersetzt ohnehin unabhängig von der Schreibweise, es spart 
also nichts.

: Bearbeitet durch User
von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Holger schrieb:
> i = *j;  // i ist irgendwas ok

Ist nicht ok, ist "undefined behavior" (UB) und kann irgendwas bewirken, 
z.B. Programmabsturz. Oder der Compiler entfernt einfach die 
main()-Funktion komplett, weil er davon ausgehen darf dass UB nie 
auftritt und somit die main() Funktion sowieso nie aufgerufen wird, weil 
sie immer zu UB führt. Das gilt auch für Lesezugriffe.

von Harald K. (kirnbichler)


Lesenswert?

Niklas G. schrieb:
> Ist nicht ok, ist "undefined behavior" (UB) und kann irgendwas bewirken,
> z.B. Programmabsturz.

Aber nur im Kontext der von Dir nicht zitierten vorangegangenen 
Codezeilen.

Für sich alleine betrachtet ist die von Dir zitierte Zeile 8 vollkommen 
legitimer Code, nämlich 'ne simple Pointerdereferenzierung.

"Kriminell" wird es durch die Zeilen 6 und 7 des Codes aus dem 
Eröffnungsthread, die den Pointer auf etwas anderes zeigen lassen als 
beim Aufruf der Funktion, der der Pointer übergeben wurde.

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.