Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C] allocare memoria per un'array di liste

    Come faccio ad allocare memoria per un array di liste, dove la lista è così definita:

    codice:
    typedef struct {
      /** la testa della lista */
      elem_t * head;
      /** la funzione per confrontare due chiavi */
      int (* compare) (void *, void *);
      /** la funzione per copiare una chiave */
      void * (* copyk) (void *);
      /** la funzione per copiare un payload*/
      void * (* copyp) (void *);
    } list_t;
    
    typedef struct elem {
      /** chiave */
      void * key;
      /** informazione */
      void * payload;
      /** puntatore elemento successivo */
      struct elem * next;
    } elem_t;
    dichiaro la variabile list_t ** table;
    dopodichè voglio allocare memoria e sapendo che la table ha lunghezza size faccio così:
    table = malloc(size*sizeof(list_t));

    Il problema è che quando utilizzo in seguito la table mi da segmentation fault, dove sbaglio???

  2. #2
    se vuoi allocare un array di liste, devi utilizzare un puntatore. Solitamente utilizzi un puntatore a puntatore quando vuoi creare una matrice:

    Codice PHP:
    int main()
    {
        const 
    int size 8;
        
    list_ttable;
        
    table = (list_t*)malloc(size sizeof(list_t));
        
    free(table);

    Inoltre la malloc ritorna un void* che devi castare verso il tipo desiderato.

    edit: dimenticavo: in caso di fallimento, malloc ritorna NULL, quindi sarebbe buona norma testare il valore di ritorno.


  3. #3
    che poi che è quello che ho fatto io..il problema è che praticamente io lavoro su una struttura che già m è stata data e la tabella è dichiarata come list_t ** table.

  4. #4
    Originariamente inviato da noiseimpera
    che poi che è quello che ho fatto io..
    No, tu hai fatto

    Codice PHP:
    list_t** table;
    table malloc(size*sizeof(list_t)); 
    questo vuol dire allocare size list_t e far puntare il blocco di memoria ad un puntatore a puntatore, che è diverso (oltre a non essere corretto) da:

    Codice PHP:
    list_ttable;
    table = (list_t*)malloc(size sizeof(list_t)); 
    dove table è un puntatore a list_t (creando quindi un array).

    il problema è che praticamente io lavoro su una struttura che già m è stata data e la tabella è dichiarata come list_t ** table.
    Se non posti codice è difficile capire perchè table è di tipo list_t**, potrebbe essere, ad esempio, un riferimento ad un puntatore:

    Codice PHP:
    void f(list_t** table) { }

    int main()
    {
        
    list_ttable = (list_t*) malloc(sizeof(list_t) * 8);    
        
    f(&table);
        
    free(table);

    per fare un esempio, oppure, come il nome suggerisce, potrebbe essere una matrice e non un array...però non so dirti senza qualche indizio in più


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.