Auflösen von übergebenem Pointer
-
Hi,
ich hab gerade ein kleines Problem, bei dem ich auf dem Schlauch stehe:
void functionA(char* zeiger1){ MessageBox(NULL, zeiger1, blabla); } char** functionB(char* tokenize){ /* Do something with tokenize, * return char* Array. */ } void functionC(char* message){ char** zeiger2 = functionB(message); MessageBox(Null, zeiger2[0], ...); /* Erster MessageBox aufruf !!! */ functionA(zeiger2[0]); } /* hier dann zweiter MessageBox aufruf - anderer Output! */
So so sieht die Situation ungefähr aus. Jedoch unterscheiden sich die Ausgaben der beiden MessageBoxen die ich aufrufe - Warum ???
An der functionB liegt es nicht, wie die erste MessageBox zeigt.
ein char*-Array B hat einen char** type, also müsste B[0] ein char* sein. Wo liegt der Fehler ? Habe ich irgendwelche lebensdauern nicht beachtet ?
-
Hast du den Code genau so ausprobiert?
bist du sicher, dass du nix an code weggelassen hast?
So wies da steht sollte genau das selbe rauskommen.
-
Ok, gerade nochmal nachgeschaut - dazwischen passiert nix. Hier aber mal das Original.
static void serv_ac(char* ac_num, SOCKET client_socket, HANDLE hToken){ /* entspricht functionA(char* zeiger1) */ char s[] = "TEST"; MessageBox(NULL, ac_num,s, 0); /* Hier die erste MsgBox ausgabe * ac_num hat den wert 8ý" */ } char** explode(char* msg){ /* Das hier entspricht functionB(char* tokenize) * Diese Funktion funktioniert nach allem Anschein - also eher uninteressant! */ /* Delimiter Char */ char Tok[] = "|"; /* Wir brauchen 3 Argumente für die MessageBox() Funktion - daher 3 Strings ! * type(result) == char** */ char* result[(unsigned)3]; unsigned char i = 0; char* tmp = strtok(msg,Tok); result[i] = tmp; while (tmp != NULL ){ /* Kontroll Funktion MessageBox(NULL, tmp, "Result",0);*/ tmp = strtok(NULL, Tok); /* im Array result weiterschreiten und die Adresse vom nächsten String zuweisen */ i = i+1; result[i] = tmp; } return result; } static void echo(SOCKET client_socket, int ernum, char* exit_flag, HANDLE hToken){ char buffer[BUFSIZE]; /* blablabla ... */ char** args ; args = explode(buffer); /* Hier die MessageBox ausgabe */ MessageBox(NULL, args[0], args[2], 0); /*args[2] hat hier den Wert 1 */ serv_ac(args[2], client_socket, hToken, tkp); /* hier die Übergabe an serv_ac(char* ac_num, ..) */ }
So, ich hoffe man findet durch. Also wenn ich dem Programm im dritten argument - und um dieses geht es hier - eine 1 übergeb, kommt einmal das ominöse 8ý" heraus und (vorher) die korrekte 1. Der Fehler muss in serv_ac(char* ac_num) liegen - aber ich verstehe nicht wo, denn da passiert nix mit dem Zeiger. Oder habe ich den speicherplatz nicht korrekt reserviert ? oder was ist mit den lebensdauern ?#
Danke !
-
Floyd schrieb:
Oder habe ich den speicherplatz nicht korrekt reserviert ? oder was ist mit den lebensdauern ?#
Lebensdauer ist Dein Problem. Das array 'result' ist lokal in Funktion B bzw. explode, d.h. der zurückgegeben Zeiger auf dieses Array zeigt auf ungültigen Speicher.
-
yep - danke! Ich bin ein troll...