2016-07-11 5 views
-2

zuzuteilen Wie der Titel schon sagt, ich möchte Struktur passieren Speicher zu funktionieren und zuteilen, vielleicht ist es eine dumme Frage, aber ich die Antwort nicht finden ..Wie Struktur passieren zu funktionieren Speicher

structName *allocate_memory(int *numPlayers,structName) 
{ 
    structName *retVal = malloc(sizeof(struct structName) * (*numPlayers)); 

    return retVal; 
} 

Die Problem ist in Parametern structName was sollte dort gehen? Wenn Sie den vollständigen Code benötigen, kann ich es posten, aber ich denke, dass es keinen Bedarf gibt.

+1

Warum übergeben Sie 'numPlayers' als Zeiger? – Barmar

Antwort

2

Sie können einen Typ nicht als Parameter übergeben. Aber man kann in seiner Größe passieren:

void *allocate_memory(int *numPlayers, size_t struct_size) 
{ 
    void *retVal = malloc(struct_size * (*numPlayers)); 

    if (!retVal) { 
     perror("malloc failed!"); 
     exit(1); 
    } 
    return retVal; 
} 

es dann wie folgt aufrufen:

struct mystruct *s = allocate_memory(&numPlayers, sizeof(struct mystruct)); 

Oder Sie gerade diese stattdessen tun, vorausgesetzt, Sie den Speicher auf alle 0 initialisiert werden soll:

struct mystruct *s = calloc(numPlayers, sizeof(struct mystruct)); 
+0

Dies ist im Wesentlichen was 'calloc()' tut, außer dass es auch den Speicher auf Null setzt. – Barmar

+0

Ja! das hat dir geholfen, danke für deine schnelle Antwort. – honeyPot

+0

Ich wollte Nullcheck in dieser Funktion setzen, habe es nicht in Frage geschrieben, das ist der ganze Sinn dieser Funktion – honeyPot

1

Sie können einen void pointer verwenden, void kann alles nehmen ... hoffe es hilft ....

0

Sie haben zwei Möglichkeiten, die erste Zurückgeben eines neuen Zeigers (siehe allocate_memory) und das zweite ist das Füllen eines vorhandenen Zeigers (siehe allocate_memory2. In beiden Fällen konvertierte ich numPlayers zu int, weil es nicht notwendig ist, unter Bezugnahme auf liefern

struct structName *allocate_memory(int numPlayers) 
{ 
    struct structName *retVal = malloc(sizeof(struct structName) * numPlayers); 
    return retVal; 
} 

void allocate_memory2(struct structName **target, int numPlayers) 
{ 
    *target = malloc(sizeof(struct structName) * numPlayers); 
} 

int main(int argc, char** argv) 
{ 
    struct structName *str; 
    struct structName *str2; 
    //After this line str is a valid pointer of size 20*sizeof(struct structName) 
    str = allocate_memory(20); 
    //After this line str2 is a valid pointer of size 20*sizeof(struct structName) 
    allocate_memory2(&str2, 20); 
} 
0

Sie keinen Typen als Parameter an eine Funktion übergeben kann.

Sie haben grundsätzlich zwei Möglichkeiten der Realisierung Ihrer allocate_memory Funktion:

  • Statt den Namen des Typs der Weitergabe einfach die Größe des Typs passieren: void *allocate_memory(int *numPlayers, size_t size). Aber das ist nur ein trivialer Wrapper für malloc.
  • Sie könnten ein Makro #define allocate_memory(num, type) (malloc(num * sizeof(type))) schreiben, um die Aufgabe zu erledigen.

von Sie suchen eine Kombination Vielleicht beide, wenn Sie wollen einige Statistiken der Speicher zugewiesen verfolgen oder nicht zusätzliche Kontrollen:

#define allocate_memory(num, type) (my_malloc((num), sizeof((type)))) 

void *my_malloc(int num, size_t size) 
{ 
    void *pMem = malloc(num * size); 

    if (pMem == NULL) 
    { 
     /* do error handling */ 
    } 

    return (pMem); 
} 

Sie können den obigen Makro verwenden, wie folgt:

pInt = allocate_memory(5, int); // allocates 5 integers 
pStruct = allocate_memory(10, some_struct); // allocates 10 some_structs 
+0

yep ich wollte null_check hinzufügen, um zu funktionieren – honeyPot