-1
votes

Comment obtenir des index initialisés et non séquentiels dans C

Je viens de langages de haut niveau et j'essaie d'apprendre c et d'améliorer mes connaissances de la manière dont les choses fonctionnent dans des niveaux inférieurs.

J'essaie donc de comprendre comment est-il possible d'obtenir uniquement des indices de tableau initialisés. Ils pourraient être non séquentiels alors simplement itération sur la matrice ne fera pas le travail.

Supposons donc que nous ayons un éventail d'entiers de taille 20, Seuls quelques éléments de cette matrice ont été initialisés avec la valeur '1'

Comment puis-je savoir quels index ont été initialisés? xxx

donc par exemple ci-dessus comment obtenir 1,5,8,16 en résultat? Est-ce que même la bonne façon de travailler avec des tableaux en C?


2 commentaires

Voir aussi geeksforgeeks.org/designated-Initializers-c


Les variables non initialisées peuvent également obtenir des valeurs de déchets. Cela dépend de votre ensemble de données I.E si vous avez une plage de valeurs spécifique pour la matrice, vous pouvez avoir cette vérification pour trouver des valeurs non initialisées.


3 Réponses :


3
votes

On ne se souvient pas desquels lesquels ont été initialisés et ceux qui ne l'ont pas fait. Dans votre exemple, vous pouvez par exemple les initialiser tous à 0 code>, puis cochez toutes les valeurs qui ne sont pas 0 code>.

data[1] is initialized to 1
data[5] is initialized to 1
data[8] is initialized to 1
data[16] is initialized to 1


1 commentaires

Sachez cependant que les données globales sont initialisées tous les zéros par défaut. Cela dépend de l'emplacement de la Déclaration: si le tableau est automatique (local, sur la pile), il peut contenir des ordures, jusqu'à ce qu'il soit explicitement rempli; Si la matrice est statique, globale, elle est initialisée avec des zéros.



1
votes

Les éléments de repos de la matrice contiendront des valeurs totalement aléatoires, éventuellement 1, vous pouvez donc trouver plus de 4 éléments contenant 1 valeur.

Pour initialiser un tableau, vous devez l'introduire ou utiliser memset (données, 0, taille de taille (données) .

La façon dont vous définissez 1 dans certains éléments est plus d'attribution et non d'initialisation.


2 commentaires

Le reste de la matrice ne peut être présumé pour contenir des valeurs du tout, aléatoires ou autrement. Pour la norme C, les valeurs des éléments non initialisés sont non spécifiées. Tel qu'utilisé dans la norme C, cela ne signifie pas seulement qu'un élément détient une certaine valeur non déterminée par le programme, comme tout ce qui est arrivé à rester à la mémoire des opérations précédentes, mais que sa valeur n'est pas spécifiée chaque fois qu'elle est utilisée. Il pourrait sembler être différent à des moments différents, même sans changement intermédiaire par le programme. La norme C offre des implémentations cette latitude pour permettre l'optimisation.


On ne "a pas à" itérer ou utiliser memset pour initialiser un tableau. À l'exception des tableaux de longueur variable, une matrice peut être initialisée dans sa définition comme dans les données int [20] = {...}; . Toutes les valeurs non explicitement énumérées dans les initialisateurs seront initialisées à zéro.



0
votes

in c, tableau contient des valeurs elles-mêmes, plutôt que des références à des valeurs. Pour votre Int Data [20] Code> Il y aura 20 emplacements alloués dans la pile, avec chaque machine à sous contenant une valeur unique de type int code>. Les emplacements alloués ne sont pas effacés. Les valeurs initiales d'éléments de tableau seront donc les données stockées dans ces emplacements de pile par qui les utilisaient avant. Affectations que vous avez faites pour les éléments de tableau, tels que data [8] = 1; code> n'initialise pas les éléments de tableau, ils remplacent simplement les valeurs actuelles des éléments par une nouvelle valeur.

En d'autres termes, tous Les éléments de votre matrice sont initialisés juste après la déclaration de tableau. Dans votre cas particulier, ils sont initialisés avec certaines valeurs détruites de la pile. Si vous souhaitez les initialiser avec certaines valeurs particulières, vous devez utiliser Initializer Array, comme celui-ci: P>

int a = 13; // Initialize to 13
int b; // Initialize to garbage from stack

a = 11; // Just assignment, not initialization
b = 17; // Yet another assignment, not initialization


1 commentaires

On ne peut pas compter sur des éléments de tableau contenant toutes les données stockées sur la pile précédemment. Pour la norme C, les valeurs des éléments non initialisés sont non spécifiées. Tel qu'utilisé dans la norme C, cela ne signifie pas seulement qu'un élément détient une certaine valeur non déterminée par le programme, comme tout ce qui est arrivé à rester à la mémoire des opérations précédentes, mais que sa valeur n'est pas spécifiée chaque fois qu'elle est utilisée. Il pourrait sembler être différent à des moments différents, même sans changement intermédiaire par le programme. La norme C offre des implémentations cette latitude pour permettre l'optimisation.