1

Je suis en train de mettre en œuvre un tableau dynamique qui doit avoir la structure suivante:allocation de mémoire Array dynamique avec vide **

typedef struct DArray{ 
    void **array; 
    int capacity; 
    int size; 
    void (*display)(FILE *, void *); //function pointer to a non-generic display function 
} DArray; 

Cependant, avec le comportement actuel, le tableau ne semble pas redimensionner et jette un segfault chaque fois que j'essaie d'accéder à un index qui n'est pas nul. Le constructeur et la fonction d'insertion sont les suivants:

DArray *newDArray(void (*d)(FILE *,void *)){ 
    DArray *myDarray = malloc(sizeof(DArray)); 
    myDarray->array = malloc(sizeof(void *)); //size = 1 for now, otherwise multiply by array length 
    myDarray->capacity = 1; 
    myDarray->size = 0; 
    myDarray->display = d; 
    return myDarray; 
} 

void insertDArray(DArray *a,void *v){ 
    if (a->size < a->capacity) 
     a->array[a->size] = v; 
    else{ 
     void **newArray = malloc(sizeof(void *) * a->capacity * 2); //double size 
     for (int i = 0; i <= a->size; i++) 
      newArray[i] = a->array[i]; //clone old array 
     a->capacity = a->capacity * 2; 
     free(a->array); 
     a->array = newArray; 
    } 
    a->size++; 
} 

J'ai du mal à comprendre mes pointeurs ici. Je pense que ce qui se passe est que le pointeur vers un-> tableau pointe toujours vers l'ancien tableau non-résolu, mais faire *a->array = newArray; ne fonctionne pas non plus. Quelqu'un peut-il nous éclairer là-dessus?

+0

Quel est le motif pour un démarrage simple (' void * ') ne pas suffire? – StoryTeller

+0

@StoryTeller le tableau doit être implémenté pour gérer les types génériques (void *). Je crois que je devrais avoir un tableau de pointeurs, d'où l'étoile double. –

+1

Si vous insérez des pointeurs dans le tableau, vous n'avez pas besoin d'un membre 'size'. Si vous insérez des objets, vous n'avez pas besoin d'un tableau de pointeurs – StoryTeller

Répondre

3

Vous avez un dépassement de mémoire tampon causé par cette boucle. Devrait être i < a->size puisque si la capacité est 5, vous ne l'agrandissez que lorsque la taille est égale à 5 et donc vous accéderez au 6ème élément du tableau.

for (int i = 0; i <= a->size; i++) 

Vous n'êtes également pas ajouté la nouvelle valeur lorsque vous redimensionnez. Peut-être changer la logique de votre code le long des lignes de ...

if (a->size == a->capacity) 
{ 
    /* resize array */ 
} 
a->array[a->size++] = v; 

... en prenant soin de vérifier les résultats de l'utilisation malloc ou realloc etc ...

+0

Merci, vous avez raison. Cependant, je reçois toujours un segfault quand j'essaye d'accéder à un-> tableau [1] après avoir inséré deux éléments. Y a-t-il quelque chose dans mon code d'insertion qui aurait pu causer cela? –

+0

@ScottSinischo Pouvez-vous créer un [exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve) et nous montrer? Comme comment vous utilisez ces fonctions? –

+0

Il serait utile si vous avez inclus quelle ligne votre débogueur dit la segfault se passe, mais j'ai remarqué un autre problème avec le code tel quel et mis à jour ma réponse. –