Array dynamisch vergrößern und an aufrufende Funktion zurückgeben?
-
Hallo,
nachdem mir bei der Inkrementierung von Pointern sehr gut weitergeholfen wurde (Dankeschön an c.rackwitz), habe ich auch schon die nächste Frage!
Folgendes Testprogramm habe ich vorbereitet.
Ich allokiere in der main-Funktion Speicher für ein Array, dass auf einer Struktur basiert. Die Größe dieses Array wird vorerst auf ein Element allokiert. Anschließend rufe ich die FunktionbuildRecipientArray( &*arrRecip, &wRecip );
auf und übergebe die Adresse des Pointers des Arrays(ist das korrekt?). Innerhalb der Funktion vergrößere ich das übergebene Array und kopiere einen String in die
memcpy( arrRecip[counter].strRecipientDomain, strRecipDomain, wRecipDomainLen );
-Variable.
Nachdem ich aus der Funktion zurückkehre befindet sich mein Pointer leider noch auf der Adresse, bei der er sich schon beim Aufruf der Funktion befand. Durch die Funktion realloc() bekam er jedoch innerhalb der Funktion eine andere Adresse!Wie kann ich den neuen Zeiger des vergrößerten Arrays der main-Funktion zurückgeben? Wichtig: Da in meinem richtigen Programm zwei Arrays übergeben und vergrößert werden, kann ich wahrscheinlich() die return Anweisung nicht benutzen, oder?
Vielen Dank & Gruß
NicoP.
RecipTest.h:
#include <windows.h> #include <stdlib.h> #include <malloc.h> #include <stdio.h> typedef struct { char *strRecipientDomain; WORD wRecipientDomainLen; char *strTests; WORD wTestsLen; } RecipientInfo; buildRecipientArray( RecipientInfo *arrRecipients, WORD *wRecip );
RecipTest.c:
#include "RecipTest.h" int main(int argc, char* argv[]) { RecipientInfo *arrRecip; WORD wRecip = 1; WORD i; arrRecip = malloc( sizeof(RecipientInfo) * 1 ); arrRecip = memset( arrRecip, '\0', sizeof(RecipientInfo) * 1 ); buildRecipientArray( &*arrRecip, &wRecip ); for( i = 0; i < wRecip; i++ ) { printf( "arrRecip[%d].strRecipientDomain: %s\n", i, arrRecip[i].strRecipientDomain ); } } buildRecipientArray( RecipientInfo *arrRecip, WORD *wRecip ) { RecipientInfo *pold; RecipientInfo *parrRecip; WORD wtest = 0; WORD wtestold = 0; WORD counter; WORD wRecipDomainLen; char strRecipDomain[] = "test.com"; wRecipDomainLen = strlen(strRecipDomain); for( counter=0; counter < 3; counter++ ) { if( counter >= 1 ) { wtest = sizeof(RecipientInfo) * (counter + 1); wtestold = sizeof(RecipientInfo) * (counter ); arrRecip = (RecipientInfo *) realloc( arrRecip, wtest ); parrRecip = arrRecip; parrRecip = parrRecip + counter; // naechstes element parrRecip = (RecipientInfo *) memset( parrRecip, '\0', sizeof(RecipientInfo) * 1 ); } arrRecip[counter].strRecipientDomain = (char *) malloc( (wRecipDomainLen + 1) * sizeof(char) ); arrRecip[counter].strRecipientDomain = (char *) memset( arrRecip[counter].strRecipientDomain, '\0', (wRecipDomainLen + 1) * sizeof(char) ); arrRecip[counter].wRecipientDomainLen = wRecipDomainLen; memcpy( arrRecip[counter].strRecipientDomain, strRecipDomain, wRecipDomainLen ); } return 0; }
-
Das Stichwort heißt "Übergabe per Referenz/Pointer":
void resize(stype**data,int size,int nsize) { *data=realloc(*data,sizeof(stype)*nsize); }
(btw, die Operatoren & und * heben sich gegenseitig auf)