6
votes

Tableau de structures en c

J'essaie de créer un tableau de structs et d'un pointeur sur ce tableau. Je ne sais pas à quel point la matrice va être grande, il devrait donc être dynamique. Ma structure ressemblerait à ceci:

stats_t stats[];
stats_t *statsPtr = &stats[0];


2 commentaires

Questions: Pouvez-vous gérer une matrice dynamique de int ? Pouvez-vous gérer une matrice statique de struct ? S'il y a une réponse à l'une de ces questions, c'est "Non", je suggérerais de travailler à ce début. Une fois que vous pouvez gérer les deux, la réponse à Ceci devrait être évidente. Enfin, vous pouvez trouver de l'aide sur les deux overflow de pile déjà.


Le suffixe _T est réservé aux en-têtes du système. Ne l'utilisez pas.


5 Réponses :


0
votes

0 commentaires

2
votes

La deuxième option d'un pointeur est bonne.

Si vous souhaitez attribuer des choses de manière dynamique, essayez: p> xxx pré>

comme Roland suggère. P> N'oubliez pas de p>

free(theStatsPointer);


4 commentaires

Le problème est que je ne connais pas le maximum tout de suite ... Je ne sais pas combien de fichiers je vais devoir faire face à la création d'un max serait une mauvaise idée.


Je ne veux pas me répéter, mais comme votre code est presque identique à celui de Sblom (autre que la déclaration correcte de ThestatsPoinger ), voir point b) dans mon commentaire là-bas. Mais +1 pour nous rappeler à gratuit () .


@Chris: Je n'ai pas vu Sblorn jusqu'à après avoir posté. Au moment où j'ai posté, je n'ai vu que le poste de Roland.


@Hristo: Max n'a pas besoin d'être une constante. Si vous devez vraiment, vous pouvez toujours utiliser realloc () si vous dépassez le bloc de mémoire déjà existant (de la taille Max STATS_T STREST). D'Oh! Vient de voir le commentaire de Chris Lutz le mentionnant aussi ... Désolé pour la Dupe, Chris! ;-)



0
votes

MALLOC code> est votre ami ici.

stats_t stats[] = (stats_t*)malloc(N * sizeof(stats_t));


5 commentaires

Le problème est que je ne sais pas tout de suite ... Je ne sais pas combien de fichiers je vais devoir traiter.


a) Vous ne pouvez pas déclarer quelque chose comme STATS_T STATS [] . C'est un tableau sans taille, pas un pointeur. Vous avez besoin de STATS_T * STATS . b) Je recommande fortement contre la mise à jour de la valeur de retour de MALLOC () en code C et l'utilisation de Tailleof (STATS_T) , qui permettent de changer le type de < Code> STATS Plus compliqué. La distribution a également d'autres stigmates moins justifiées qui y sont associées.


Que recommanderiez-vous au lieu de taille de ?


taille de . : PI préférez l'utilisation de Tailleof * PTR sur Tailleof (type) car si le type de PTR change, Tailleof * PTR < / Code> S'adapte automatiquement à la taille correcte, tandis que Tailleof (type) doit être modifié manuellement et est donc plus sujette d'erreur. Dans ce cas, peu importe parce que je doute que le type de statistiques changera, mais dans d'autres cas, il peut être utile.


@Chrislutz Ironiquement, je viens d'utiliser votre suggestion pour la première fois dans mon code C, puis dans les 60 secondes devait renommer la variable, de même que de modifier aussi le paramètre Taille de la taille !



6
votes

C'est comme ça que c'est généralement fait: xxx

puis, pour le remplir, xxx


5 commentaires

a) Vous devez utiliser taille_t au lieu de int . int est un type signé et nous voulons rarement également allouer une matrice avec -1 longueur. b) J'utiliserais Tailleof * PTR au lieu de Tailleof (STATS_T) , mais cela n'a pas d'importance ici.


Merci pour vos réponses. Je comprends comment allouer la mémoire et y accéder, mais le problème est que je vais maîtriser une structure à la fois. Chaque fois qu'un nouveau fichier vient, je vais malcoc une autre structure pour cela. Donc, je ne peux pas que Malloc 'n' struct, puis revenir en arrière et travailler dessus, mais j'ai besoin de dire "Voici le tableau, développer (en ajouter-y) une fois chaque fois qu'un nouveau fichier vient." Cela a-t-il du sens?


@Hristo: Pour cela, utilisez la fonction reallococ () pour redimensionner une matrice allouée avec MALLOC () . C'est pourquoi cela s'appelle une allocation dynamique.


Ahh ... merci. C'est ce que je cherchais. Maintenant, j'ai juste besoin d'apprendre comment cela fonctionne et la syntaxe.


Utilisation de Realloc chaque fois que le tableau augmente est très inefficace. Mieux vaut la taille de la matrice à chaque fois. Vous devrez garder une trace du nombre de combien de temps sont alloués séparément du nombre de personnes sont utilisées. Une autre solution consiste à utiliser un Tailq ou similaire. Edit: Désolé, c'est vraiment vieux, n'a pas vu ça.



0
votes

En fonction de vos réponses à d'autres réponses, il semble que vous ayez besoin d'une structure de données dynamique comme une liste liée. Jetez un coup d'œil au File d'attente (3) Ensemble de Installations.


3 commentaires

La file d'attente (3) ne sont pas standard.


Quelle bibliothèque de structure de données C est standard?


Les seules structures de données C «standard» (lorsque «standard» signifie ISO C99) sont le pointeur, le tableau, la structure et l'union. ISO C99 ne sait rien des listes, des ensembles, des cartes, des arbres, peu importe. Vous devez utiliser une bibliothèque externe pour toutes ces choses.