Allocare dinamicamente la memoria per un Array di Struct

Qui è quello che sto cercando di fare:

#include <stdio.h>
#include <stdlib.h>

struct myStruct {
    int myVar;
}

struct myStruct myBigList = null;

void defineMyList(struct myStruct *myArray)
{
     myStruct *myArray = malloc(10 * sizeof(myStruct));

     *myArray[0] = '42';
}

int main()
{
     defineMyList(&myBigList);
}

Sto scrivendo un semplice programma in C per eseguire questa operazione. Sto usando il GNU99 Xcode 5.0.1 compilatore. Ho letto molti esempi, e il compilatore sembra di essere in disaccordo su dove utilizzare il struct tag. Utilizzando un struct di riferimento all’interno del sizeof() comando non sembra riconoscere il struct a tutti.

n = sizeof( struct var ); struct var * mBigList = NULL;

OriginaleL’autore Mark Löwe | 2013-11-13

5 Replies
  1. 4

    Ci sono un paio di errori nel codice. :

    struct myStruct *myBigList = NULL; /* Pointer, and upper-case NULL in C. */
    
    /* Must accept pointer to pointer to change caller's variable. */
    void defineMyList(struct myStruct **myArray)
    {
         /* Avoid repeating the type name in sizeof. */
         *myArray = malloc(10 * sizeof **myArray);
    
         /* Access was wrong, must use member name inside structure. */
         (*myArray)[0].myVar = 42;
    }
    
    int main()
    {
         defineMyList(&myBigList);
         return 0; /* added missing return */
    }

    Fondamentalmente, è necessario utilizzare il struct parola chiave a meno che non si typedef via, e la variabile globale myBigList era il tipo sbagliato.

    +1 per chiedere di evitare di “struttura” in sizeof e utilizzare il nome di istanza, invece.
    Questo ha funzionato alla grande! Grazie! L’ ** è stata la chiave. Virtuale bevande per tutti! Grazie di nuovo. Tutti di voi ha risolto un sacco di confusione.
    Si dovrebbe liberare myBigList all’interno di main()

    OriginaleL’autore unwind

  2. 2

    Questo perché struct nome non è automaticamente convertito in un tipo di nome. In C (non C++) si sono esplicitamente typedef un nome di tipo.

    Utilizzare

    struct myStruct instance;

    quando si utilizza il nome del tipo O typedef come questo

    typedef struct {
        int myVar;
    } myStruct;

    ora var può semplicemente essere utilizzato come un nome di tipo simile a int o di qualsiasi altro tipo.

    Di notare che questa è necessaria solo in C++ automaticamente typedef ogni struct /nome della classe.

    Una buona convenzione quando si estende questo per le strutture che contengono i puntatori per lo stesso tipo di qui

    OriginaleL’autore fayyazkl

  3. 1
        sizeof(struct myStruct)

    o

        typedef struct myStruct myStrut;
        sizeof(myStruct)

    OriginaleL’autore x5lcfd

  4. 0

    In ordine al lavoro per tutti e 10 gli elementi di matrice di linea:

    myArray[0].myVar = '42';

    dovrebbe essere:

    (*myArray)[0].myVar = '42';
    '42' non è un carattere normale, costante, però!
    Questo mi sembra un commento sulla accettata una risposta, non una risposta alla domanda stessa.

    OriginaleL’autore RazvanD

  5. 0

    Non la seguente dichiarazione

    myArray[0].myVar = '42'; 

    essere questo?

    (*myArray)[0].myVar = 42;

    myvar è un numero intero.

    Questo mi sembra un commento sulla accettata una risposta, non una risposta alla domanda stessa.

    OriginaleL’autore Nirav Ambaliya

Lascia un commento