Wieso funktioniert dass eine Funktion ein Pointer auf lokaler Array Rausgibt?
-
Hallo zusammen,
In meiner Programm nütze ich die Methode:
char *ip4tos(struct sockaddr_in addr){ char str[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &(addr.sin_addr), str, INET_ADDRSTRLEN); return str; } char* ip6tos(struct sockaddr_in6 addr) { char str[INET6_ADDRSTRLEN]; inet_ntop(AF_INET6, &(addr.sin6_addr), str, INET6_ADDRSTRLEN); return str; }
die Ipv4 v6 Adressen zum String umwandeln, 100% von einem Beispiel aus Internet
kopiert. Ploetzlich habe ich gesehn dass die im Funktion so allokierte arrays
sollen normalerweise nicht überleben, aber in dem Programm funktioniert es doch.
Liegt es vllt dran dass das inet_ntop es aufm Heap allokiert, dann ist in Beispiel sowieso was falshes, dann sollte char * str sein, oder?Nein, mit char * str; geht es komischerweise shief.
MFG.
P.S. beispiel über die Erstellung von Raw Sockets.
-
Beispiel aus Internet kopiert
Link?
Ansonsten: Das komische an undefiniertem Verhalten ist, es funktioniert manchmal.*
*die Sparvariante von Erklaerung
-
o4kareg schrieb:
... aber in dem Programm funktioniert es doch.
Wie hast du das festgestellt?
Die Daten werden beim verlassen der Funktion nicht (aktiv) zerstört.
Der Datenbereich ist nur zur weitern Benutzung freigegeben.Funktioniert das immer noch?
.... char *ip4; char *ip6; ip4 = ip4tos(....); printf("ip4: %s\n", ip4); ip6 = ip6tos(....); printf("ip6: %s\n", ip6); printf("ip4: %s\n", ip4);
Man darf auch nicht alles aus dem Internet glauben.
Ich weiß, diese Aussage ist ein Eigentor
-
Ja ich mache Z.B Printouts:
printf("\tAddress: %s\n",ip4tos(*(struct sockaddr_in *)a->addr));
.
Kann es vllt liegen dass dies mit g++ in Eclipse compiliert wird (weil es insgesamt als CPP Project angelegt wurde)
-
Das Problem tritt dann auf, wenn du die Daten später noch mal verwenden willst.
Siehe mein Beispiel.
-
Man braucht hier nicht darüber diskutieren, dass es funktioniert. Falsch ist es trotzdem. Deshalb: Mach das nicht!