Si nous pouvons utiliser des pointeurs et MALLOC code> pour créer et utiliser des tableaux, pourquoi le type de matrice existe-t-il dans C? N'est-il pas inutile si nous pouvons utiliser des pointeurs à la place? P>
6 Réponses :
Les tableaux sont plus rapides que la répartition de la mémoire dynamique.
Les tableaux sont "alloués" à "l'heure de la compilation", tandis que MALLOC attribue au moment de l'exécution. Alloué prend du temps. P>
En outre, c N'andonne pas que Modifier em> p> Exemple de tableau P> MALLOC () code> et des amis sont disponibles dans des implémentations autonomes. P>
int main(void) {
size_t len = 52;
int *deck = malloc(len * sizeof *deck);
if (deck) {
play(deck, len);
}
free(deck);
return 0;
}
L'allocation des deux arrive au temps d'exécution. La différence est que c vous permet de fournir la taille au moment de l'exécution pour un mais pas l'autre.
Pouvez-vous me donner plus de détails ce qui se passe dans le temps de compilation et le temps d'exécution lorsqu'un tableau est situé? Même un exemple serait utile. Merci.
@Arak, je pense que par répartition au moment de l'exécution, il signifie que le logiciel doit demander la mémoire du système d'exploitation (avec l'appel à Malloc code>), par opposition à simplement ajuster le pointeur de pile (et Ainsi "alloué" à "compiler l'heure").
Les tableaux ont leurs utilisations et doivent être utilisés quand vous le pouvez, car l'allocation statique aidera à rendre des programmes plus stables et que la nécessité est parfois nécessaire de s'assurer que les fuites de mémoire ne se produisent pas. P>
Ils existent parce que certaines exigences les nécessitent. P>
Dans une langue telle que BASIC, vous avez certaines commandes autorisées, et cela est connu, en raison de la construction de la langue. Ainsi, quel est l'avantage d'utiliser MALLOC pour créer les tableaux, puis les remplir dans des chaînes? P>
Si je dois définir les noms des opérations quand même, pourquoi ne pas les mettre dans un tableau? p>
C a été écrit comme une langue à usage général, ce qui signifie qu'il devrait être utile dans n'importe quelle situation, ils devaient donc s'assurer que les constructions étaient utiles pour écrire des systèmes d'exploitation ainsi que des systèmes embarqués. P>
Un tableau est un moyen sténique de spécifier le début d'un malloc par exemple. P>
Mais, imaginez essayer de faire des mathématiques à matrice en utilisant des manipulations de pointeur plutôt que Vec [x] * Vec [y] code>. Il serait très sujet à des erreurs difficiles à trouver. P>
Ce n'est pas une mauvaise question. En fait, le début de C n'avait aucun type de tableau. P>
Les matrices globales et statiques sont allouées à la compilation (très rapide). D'autres tableaux sont alloués sur la pile au moment de l'exécution (rapide). L'allocation de mémoire avec MALLOC (à utiliser pour un tableau ou autrement) est beaucoup plus lente. Une chose similaire est observée dans la classique: la mémoire allouée de manière dynamique est plus lente de traiter. P>
La vitesse n'est pas la seule question. Les types de tableau sont automatiquement traités lorsqu'ils ne sortent pas de la portée, ils ne peuvent pas être «fui» par erreur. Vous n'avez pas besoin de vous soucier de libérer accidentellement quelque chose deux fois, et ainsi de suite. Ils facilitent également la tâche des outils d'analyse statique de détecter des bogues. P>
"Vous inquiétez de libérer accidentellement quelque chose à deux reprises" - Supprimer un pointeur NULL est un non-OP tel que défini par la norme, c'est-à-dire que c'est sûr. Maintenant, le fait que vous appeliez Supprimer sur un pointeur NULL indique probablement un autre problème, mais l'appel lui-même est en sécurité.
@Ed Swangren: Bien qu'une pratique codante commune consiste à définir des variables de pointeur sur NULL après les libérer: a) Tout le monde ne le fait pas, et b) dans des structures de données pouvant avoir plusieurs pointeurs pointant vers la même chose, cela ne peut pas empêcher la problème
Les matrices multidimensionnelles semblent être difficiles à rendre difficiles à faire avec quelque chose comme _alloca code>, sans que certains frais généraux ne soient apparemment pas prêts à prendre. Aussi Tailleof code> ne serait pas aussi facile à mettre en œuvre pour donner un résultat temporel de compilation (le compilateur doit essentiellement en arrière le pointeur pour voir quel initialisateur a été utilisé pour ce pointeur, puis déciderait de céder la taille de la pointe du pointeur, ou du "tableau")
@LITB: Les tableaux multidimensionnels ne sont pas difficiles à faire, certains fardeaux supplémentaires du travail vont sur le programmeur (c'est-à-dire garder une trace des dimensions de la matrice elles-mêmes) mais il n'y a pas de pénalité de performance. Voir mon commentaire à votre réponse.
Les tableaux sont une jolie amélioration de la syntaxe par rapport à la traite des pointeurs. Vous pouvez faire toutes sortes d'erreurs sans le savoir lors de la gestion des pointeurs. Et si vous déplacez trop d'espaces dans la mémoire, car vous utilisez la mauvaise taille d'octet? P>
En C, les tableaux et les pointeurs utilisent toutes les deux la même méthode de déterminer combien d'octets à déplacer.
@Artelius, pas du tout. Les tableaux utilisent leur type pour connaître ce que le décalage à utiliser lors de l'indexation et leur propre adresse pour connaître l'adresse de base au démarrage, tandis que les indicateurs utilisent l'adresse stockée entre eux pour connaître l'adresse de base et ne savent pas les compensations (vous devez dites-leur manuellement). +1 :)
@LitB: De quoi parlez-vous? Les tableaux et les pointeurs Les deux i> utilisent leur signature de type pour savoir ce qui décalent de l'adresse de base à utiliser (bien que vous ayez raison que la source de cette adresse de base est différente).
Eh bien, oui, mais lorsque vous avez un tableau multi-DIM int [2] [2] code>, puis avancez par Tailleof (int) code> est faux lorsque vous faites A [1] code>, vous devez avancer par Tailleof (int) * 2 code> :)
IMO, la phrase "Utilisation de la mauvaise taille d'octet" implique que Omouse estime que le pointeur arithmétique est toujours fait en octets (une idée fausse de nombreux débutants C - Je pensais que c'était le cas moi-même à un moment donné). Les matrices multimids sont un problème, mais je ne pense pas qu'ils étaient le problème Omouse n'avait en tête. S'il avait quelque chose d'autre à l'esprit, il est le bienvenu pour le rendre clair.
voir Cette question discutant de l'espace durcissement et C. parfois dynamique est juste une mauvaise idée, j'ai travaillé avec C bibliothèques entièrement dépourvu de malloc () et d'amis. P>
Vous ne voulez pas de satellite Déroferencer un pointeur NULL, plus que vous souhaitez que vous souhaitiez un logiciel de contrôle de la circulation aérienne, oubliant des blocs de tas à zéro. P>
c'est aussi important (comme d'autres l'ont souligné) pour comprendre ce qui fait partie de C et ce qui l'étend à diverses normes uniformes (c'est-à-dire POSIX). P>
Explication de Dennis Ritchie à propos de C Historique :
embryonnaire c fort> p>
NB existait si brièvement qu'aucune description complète de celle-ci n'a été écrite. Il fournissait les types Int et Char, les tableaux d'entre eux et les pointeurs qui leur sont déclarés dans un style caractérisé par p>
struct { int inumber; char name[14]; };
Qu'entendez-vous par «type de tableau»?
int x [6]; code>?Je ne savais pas qu'il y avait un type "tableau" en C.
Je prépare cette question plus parce qu'il existe une discussion intéressante dans les réponses.
Il s'agit d'une question parfaitement valable de la curiosité réfléchie. Up voté +1.