Verständnisfrage -> call by reference-strukturen
-
Zugegeben, folgender Code schaut wüst aus, aber nach meinem (offensichtlich falschen) Denkschema, sollte in der Funktion f() alles glatt gehen - und ich frage mich jetzt warum nach der markierten Zeile die wildesten Sachen mit der Struktur passieren... ?!
(Einie genauere Fehlerbeschreibung kann ich leider nicht geben, aber es schaut ganz danach aus, als seien die Fehler 'undefiniertem Verhalten' zuzuordnen)
#include <stdio.h> struct str { char i1; char i2; char *st; }; void f(char *buf, struct str *s); int main() { struct str bla; char buf1[5] = { 5, 6, 'N', 'o', 0 }; char buf2[5] = { 99, 100, 'Y', 'o', 0 }; bla.i1 = 1; bla.i2 = 2; bla.st = &buf1[2]; printf("bla.i1 = %d, i2:%d - st: '%s'\n", bla.i1, bla.i2, bla.st); f(buf2, &bla); printf("bla.i1 = %d, i2:%d - st: '%s'\n", bla.i1, bla.i2, bla.st); return 0; } void f(char *buf, struct str *s) { char *p = buf; /*********************************/ /* Hier geht nun einiges schief! */ s = (struct str *)p; /*********************************/ s->st = &buf[2]; printf("-> f() -> s->i1 = %d, s->i2%d - s->st: '%s'\n", s->i1, s->i2, s->st); }
Gruss,
FBEdit: Ach ja - Sinn und Zwech der ganzen Sache soll sein, die beiden chars in 'einem Aufwisch' in die Struktur zu setzen...
-
naja, was du machst ist einfach falsch.
du änderst den Pointer einfach auf ein char Array, dass ist 1. schlecht, weil dieses char Array nicht die entspr. Binär Representation der eigentlich Struktur beinhält und 2. gibt es in C kein call-by-reference, die Pointer werden by-value übergeben, also bringt es dir nichts den Pointer zu verändern, dass wirkt sich nicht für den Aufrufer der Funktion aus
-
Ich versuchs mal aufzudröseln: Du übergibst also einen Pointer auf ein Array von 5 chars, und einen Pointer auf ein struct. Dann wirfst du den Pointer auf das struct weg und läßt ihn auf den char-Pointer zeigen. Jetzt kommt der Witz: Du weist dem Pointer-Element der struct die Adresse des 2. Elements im Buffer zu. Bei einer gepackten Anordnung wär das die eigene Adresse. Davon kann man aber nicht unbedingt ausgehen, und ich kenn zwar dein System nicht, würde aber von 32bit ausgehen. Dh an Offset 2 stehen irgendwelche Padding Bytes, der Pointer steht erst ab Offset 4 und ist 4 Bytes groß => du schreibst über das Ende des Arrays hinaus. Was das ganze soll ist mir natürlich immer noch nicht klar.
Könntest du solche Schweinereien einfach sein lassen?
-
Könntest du solche Schweinereien einfach sein lassen?
LOL
-
Erzähl mal was willst du eigentlich tun?
Was du getan hast ist nicht durchschaubar.
-
PAD schrieb:
Erzähl mal was willst du eigentlich tun?
Was du getan hast ist nicht durchschaubar.doch, er will folgendes erreichen
s->i1=5; s->i2=6; s->st="No"; //jetzt wird es doch ein bissel undurchsichtig s->st=buf2;
-
Okay - also auf die Idee bin ich gekommen, als ich eine (Terminfo-) Datei auslesen und den Header komplett in eine passende Struktur stopfen wollte.
(Ich habe mal ein weiteres Testprogramm, das nicht ganz so aus dem Zusammenhang gerissen ist auf einen http-Server gestellt. Wer es sich anschauen möchte kann das hier tun:
http://home.arcor.de/fonebone/tet_win.cpp)Dann wirfst du den Pointer auf das struct weg und läßt ihn auf den char-Pointer zeigen
Ja
Davon kann man aber nicht unbedingt ausgehen, und ich kenn zwar dein System nicht, würde aber von 32bit ausgehen. Dh an Offset 2 stehen irgendwelche Padding Bytes, der Pointer steht erst ab Offset 4 und ist 4 Bytes groß => du schreibst über das Ende des Arrays hinaus
Ja, daran habe ich eigentlich als erstes gedacht, aber ich habe das gleiche auch mit ausreichend großen Buffer versucht und im Debuger schaut es auch nicht nach 'Padding-Bytes' aus
Aber die Zeile
s->st = &buf[2];
ist ja nicht mein Problem. Man könnte diese auch durch
s->i1 = 2;
oder so ersetzen - und der 'Fehler' bleibt bestehen.Vielmehr scheit der Hase hier
s = (struct str *)p;
begraben zu liegen, denn wenn ich diese Zeile weglasse funkitoniert alles so, wie gelernt, d.h die Änderungen in f() wirken sich auch auf die Struktur in main() aus.
-
du hast es wohl nicht verstanden.
Das Problem ist, dass das char Array nicht in die eigentliche Binär representation der struct passt. Du kannst diese so nicht initalisieren. Versuch es einfach gar nicht und benutze einen vernünftigen weg
-
du hast es wohl nicht verstanden
Daher vielleicht auch dieses Topic für den Thread...
Egal, Danke für den Hinweis 'die Pointer werden by-value übergeben, also bringt es dir nichts den Pointer zu verändern'