Exemple A: length est une variable entière
int values[10][2];
Ce tableau n'aura pas tous les éléments à l'intérieur sous forme de zéros.
Exemple B :
int values[length][2];
Celui-ci sera mis à zéro.
Ma principale question est de savoir comment puis-je faire en sorte que le premier soit initialisé en tant que zéros? p>
Mais j'aimerais que quelqu'un puisse expliquer pourquoi le comportement est différent?
3 Réponses :
essayez d'utiliser calloc, il initialise les déchets de mémoire aux 0
le fait est qu'il pourrait être initialisé par des 0 si vous avez de la chance et en fonction du compilateur que vous utilisez. Le plus simple pourrait être:
memset (valeurs, '\ 0', sizeof (int) * longueur * 2);
Toute variable définie dans la portée du bloc (c'est-à-dire à l'intérieur d'une fonction ou d'un bloc englobant) n'est pas initialisée implicitement. Ses valeurs sont indéterminées . C'est le cas de vos deux exemples. Ce n'est pas parce que les valeurs se sont avérées être 0 qu'elles ont été initialisées.
Si le tableau est question n'est pas un tableau de longueur variable, vous pouvez l'initialiser comme ceci:
XXX
Ceci initialise explicitement un élément du tableau 2D à 0, et initialise implicitement le reste à 0.
Cependant, un VLA ne peut pas être explicitement initialisé. Vous devez donc utiliser memset pour définir les octets sur 0.
int values[length][2]; memset(values, 0, sizeof values);
Pouvez-vous faire sizeof values ici? Inconnu au moment de la compilation.
@WeatherVane Oui, c'est un tableau local, donc il obtient la taille du tableau. De plus, comme il s'agit d'un VLA, l'opérateur sizeof est évalué au moment de l'exécution au lieu de la compilation.
J'ai supprimé le commentaire parce que je viens de remarquer mon erreur ... Vous avez tout à fait raison, l'utilisation de memset fait exactement ce que je demandais
juste dans une autre note: est-il indifférent que le tableau soit 2d? Le comportement attendu est-il exactement le même dans un 1d? @dbush
@walkman C'est exact. Elle s'applique à toute variable quel que soit son type.
merci beaucoup pour le temps!
Pédantique, mais la portée n'a pas d'importance - elle affecte simplement la visibilité de l'identifiant - seule la durée de stockage compte . Vous pouvez (presque) toujours définir une variable avec une durée de stockage statique où vous pouvez en définir une avec automatique. Les seules exceptions qui viennent à l'esprit concernent l'initialisation de la boucle et les paramètres de fonction.
Si ce sont des variables locales (la première doit être), alors aucune n’est initialisée à une valeur quelconque. Vous pouvez explicitement initialiser le second avec
int values [10] [2] = {0};mais pas le premier. Vous devez utilisermemsetou des boucles.