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];
5 Réponses :
La deuxième option d'un pointeur est bonne.
Si vous souhaitez attribuer des choses de manière dynamique, essayez: p> comme Roland suggère. P> N'oubliez pas de p> free(theStatsPointer);
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 code>), voir point b) dans mon commentaire là-bas. Mais +1 pour nous rappeler à gratuit () code>.
@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! ;-)
MALLOC code> est votre ami ici. stats_t stats[] = (stats_t*)malloc(N * sizeof(stats_t));
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 [] CODE>. C'est un tableau sans taille, pas un pointeur. Vous avez besoin de STATS_T * STATS CODE>. b) Je recommande fortement contre la mise à jour de la valeur de retour de MALLOC () code> en code C et l'utilisation de Tailleof (STATS_T) CODE>, qui permettent de changer le type de < Code> STATS CODE> 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 code>?
taille de code>. : PI préférez l'utilisation de Tailleof * PTR Code> sur Tailleof (type) code> car si le type de PTR code> change, Tailleof * PTR < / Code> S'adapte automatiquement à la taille correcte, tandis que Tailleof (type) code> 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 code> 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 code>!
C'est comme ça que c'est généralement fait: puis, pour le remplir, p>
a) Vous devez utiliser taille_t code> au lieu de int code>. int code> est un type signé et nous voulons rarement également allouer une matrice avec -1 longueur. b) J'utiliserais Tailleof * PTR code> au lieu de Tailleof (STATS_T) CODE>, 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 () code> pour redimensionner une matrice allouée avec MALLOC () code>. 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.
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) CODE> Ensemble de Installations. P>
La file d'attente (3) code> 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.
Questions: Pouvez-vous gérer une matrice dynamique de
int code>? Pouvez-vous gérer une matrice statique destruct code>? 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 i> devrait être évidente. Enfin, vous pouvez trouver de l'aide sur les deux overflow de pile déjà.Le suffixe
_T code> est réservé aux en-têtes du système. Ne l'utilisez pas.