Je suis aux prises avec une struct C qui doit tenir un tableau dynamique de struct plus petits:Tableau C gratuit dynamique de struct - Pourquoi sont-ils pas Contigous
typedef struct issueStruct {
int data;
} issue;
typedef struct volumeStruct {
issue* collection;
size_t elements;
} volume;
Je peux créer dynamiquement autant question struct que je comme dans le tableau d'une structure de volume. Je peux également itérer à travers ce tableau:
int main(){
volume* TimeMagazine = (volume*)malloc(sizeof(volume));
TimeMagazine->collection = (issue*)malloc(4 * sizeof(issue));
TimeMagazine->elements = 4;
issue* ptr = TimeMagazine->collection;
int i;
// Populate & iterate through array:
i = 0;
while(i < TimeMagazine->elements){
ptr->data = 100*i;
printf("%d) %d\n", i, ptr->data);
i++;
ptr = ptr+i; // Advance ptr
}
return 0;
}
OUTPUT:
[Linux]$ gcc -Wall magazines.c
[Linux]$ ./a.out
0) 0
1) 100
2) 200
3) 300
[Linux]$
Jusqu'ici, tout va bien. Quand je passe en revue ce qui précède dans GDB, tout semble correct, même si je remarque que les structures de problèmes ne semblent pas avoir d'adresses mémoire contiguës. Voici les adresses de mémoire que j'ai vues:
issue 0) 0x602030
issue 1) 0x602034
issue 2) 0x60203c
issue 3) 0x602048
Cela m'a donné une pause; J'aurais supposé que tous les problèmes seraient séparés par 4 octets, comme sizeof(issue) = 4
. Plus sérieusement, lorsque je modifie mon code "itérer" pour libérer les éléments du tableau, mon code segmente les fautes. Plus précisément, il fait défaut lorsqu'il tente de libérer le second numéro. Voici le code:
i = 0;
ptr = TimeMagazine->collection;
issue* ptr2 = ptr;
while(i< TimeMagazine->elements){
printf("freeing %d...\n", i);
i++;
free(ptr2); // free ptr2
ptr2 = ptr = ptr+i; // advance ptr & ptr2
}
est ici l'erreur (GCC sous Linux):
*** Error in `./a.out': free(): invalid pointer: 0x000000000137c034 ***
Je suis sûr que je manque quelque chose ici, mais pas sûr de ce que. Quelqu'un peut-il recommander un moyen efficace de libérer() les éléments du tableau?
Merci beaucoup!
-Pete
PS - Il y a beaucoup de « libérant ainsi struct dans le tableau » messages, mais aucun ne semblait correspondre exactement ce que je fais. Donc je poste ceci dans l'espoir que ma version de cette question est unique.
Un 'malloc', un' free'. C'est la règle. Pour le moment, vous avez un 'malloc' pour tout le tableau' collection' et vous essayez d'avoir plusieurs appels 'free' avec un pour chaque élément du tableau (bien que l'arithmétique de votre pointeur soit incorrecte comme indiqué dans la réponse ci-dessous) . – kaylum