Zeiger Problem: Übergabe von Array (Adresse wird ungültig?)
-
Hallo!
Ich versuche einer Funktion ein Array unbestimmter Größe als Zeiger zu übergeben, damit die Funktion das Array füllen kann. Jedoch scheint es, dass nach Ende der Funktion die Adresse des Arrays ungültig wird und ich weiss nicht warum:
void IpVon(char* hostName, in_addr* ipArray, int &anzIPs){ //anzIPs um später die Arraygröße zu wissen WSADATA winsockDaten; WORD verlangteVersion = MAKEWORD(2,0); hostent *host; if(!WSAStartup(verlangteVersion, &winsockDaten)){ //Winsock starten host = gethostbyname(hostName); //HostInfos kriegen for(anzIPs=0;host->h_addr_list[anzIPs];anzIPs++); //Zählen wieviele IPs vorhanden sind ipArray = new in_addr[anzIPs]; //So viel Platz reservieren und die neue Adresse dem Zeiger zuweisen for(int i=0; i<anzIPs; i++){ //IP Adresse holen ipArray[i].S_un.S_un_b.s_b1 = host->h_addr_list[i][0]; ipArray[i].S_un.S_un_b.s_b2 = host->h_addr_list[i][1]; //und in Array speichern ipArray[i].S_un.S_un_b.s_b3 = host->h_addr_list[i][2]; ipArray[i].S_un.S_un_b.s_b4 = host->h_addr_list[i][3]; } Form1->Memo1->Lines->Add(inet_ntoa(ipArray[0])); //das funktioniert noch } } void __fastcall TForm1::Button1Click(TObject *Sender) { int anzahlIPs=0; in_addr *ipListe; IpVon("computername", ipListe, anzahlIPs); Form1->Memo1->Lines->Add(inet_ntoa(ipListe[0])); //das nicht! }
Kann mir jemand helfen? Danke!
-
uebergib mal ne referenz auf den zeiger.
schliesslich uebergibst du den zeiger by value - dh der zeiger wird kopiert. wenn du den zeiger in der funktion veraenderst, aenderst du nur eine kopie.
-
Ah super! Jetzt funktioniert´s! Danke, Shade of Mine!
void IpVon(char* hostName, in_addr* &ipArray, int &anzIPs)
Ich dachte, dass Zeiger generell als "Call by Reference" übergeben werden. Hab ich das jetzt richtig verstanden, dass, wenn ich einen Zeiger übergebe, ich eine Kopie der Adresse auf das, was er zeigt übergebe und nicht die Adresse des Zeigers?
So ganz hab ich das wohl noch nicht begriffen
Jedenfalls Vielen Dank für die schnelle Hilfe!
Inq.
-
inquisitor schrieb:
Ich dachte, dass Zeiger generell als "Call by Reference" übergeben werden.
Ne, kleine Durcheinanderbringung deinerseits: Man kann Zeiger benutzen, um Call-by-reference zu erreichen, indem man die Adresse des Objekts übergibt, das by-ref übergeben werden soll. Du hättest also in_addr** ipArray übergeben müssen, dann irgendwo *ipArray = new ... etc, das wär auch gegangen. In C ist das so üblich, in C++ gibts echte Referenzen.
-
@Bashar
Ja Du hast recht: so geht´s auch:void IpVon(char* hostName, in_addr** ipArray, int &anzIPs){ WSADATA winsockDaten; WORD verlangteVersion = MAKEWORD(2,0); hostent *host; if(!WSAStartup(verlangteVersion, &winsockDaten)){ host = gethostbyname(hostName); for(anzIPs=0;host->h_addr_list[anzIPs];anzIPs++); *ipArray = new in_addr[anzIPs]; for(int i=0; i<anzIPs; i++){ ipArray[i][0].S_un.S_un_b.s_b1 = host->h_addr_list[i][0]; ipArray[i][0].S_un.S_un_b.s_b2 = host->h_addr_list[i][1]; ipArray[i][0].S_un.S_un_b.s_b3 = host->h_addr_list[i][2]; ipArray[i][0].S_un.S_un_b.s_b4 = host->h_addr_list[i][3]; } } } --------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { int anzahlIPs=0; in_addr *ipListe; IpVon("computername", &ipListe, anzahlIPs); Form1->Memo1->Lines->Add(inet_ntoa(ipListe[0])); }
Vielen Dank für die Erklärung!!