J'ai déclaré et initialisé un tableau dans la méthode principale de programme C et défini une méthode pour imprimer les éléments de la matrice, mais elle imprime des valeurs de déchets au lieu de la valeur réelle.
J'ai essayé le code suivant. P>
The value of arr[1] is 50 The value of arr[2] is 34 The value of arr[3] is 20 The value of arr[4] is 10 The value of arr[5] is 79 The value of arr[6] is 100 The value of arr[7] is 3538944 The value of arr[8] is 28 The value of arr[9] is 6422300 The value of arr[10] is 3538944 The value of arr[11] is 6422368 The value of arr[12] is 4198966 The value of arr[13] is 1 The value of arr[14] is 8263032 The value of arr[15] is 8266360 The value of arr[16] is 2 The value of arr[17] is 0
3 Réponses :
Cela ne fonctionne pas car il ne peut pas simplement trouver la taille de la matrice comme ça. ceci va maintenant arrêter Impression lorsque le int ARR [] CODE> est désintéressé dans un pointeur et votre fonction n'a aucun moyen de connaître la taille de la matrice. Il ne restera que continuer à courir après avoir atteint la fin de la matrice, ce qui est un comportement indéfini. Ce qui se passe susceptible, c'est qu'il imprime des données aléatoires sur la pile jusqu'à ce qu'elle rencontre quelque chose qui représente un
0 code> en tant qu'oeur ou jusqu'à ce qu'il y ait une violation d'accès.
tandis que (ARR [I] ) code> ne fait pas ce que vous semblez penser que ça fait. Cela ne vérifie pas si c'est valide, il vérifie simplement si
arr [i] code> a la valeur
0 code> (qui est ensuite converti implicitement en
false code> ). Coïncidence, cela signifie que vous pouvez utiliser
0 code> en tant que valeur sentinelle sur le signal que vous avez atteint la fin de la matrice: p>
0 code> est atteint et que vous n'avez plus de comportement non défini. p> p>
D'accord, je l'accepte. Mais pourquoi elle n'est pas imprimée pour l'index de 1 à 6, selon votre indice qu'il doit imprimer les {15, 50, 34, 20, 10, 79, 100} et une fois qu'il dépasse la taille de la matrice, il peut imprimer des Valeur des ordures.
@ B.Balamanigandan Le premier indice de tableau est 0 non 1. Est-ce ce que vous vous demandez?
@ B.Balamanigandan Une fois qu'il dépassait la limite de la matrice, il est un comportement indéfini afin qu'il n'y ait aucune garantie sur ce qui se passe. L'impression des valeurs de déchets est une manifestation courante de UB lors de l'essai d'imprimer des valeurs, mais cela pourrait également faire quelque chose de totalement différent.
@ B.Balamanigandan Vous avez changé le code. auparavant que vous aviez i ++ code> avant le
printf code>. Ce qui entraînerait le premier élément de la matrice ne pas être imprimé exactement comme vous l'avez montré. Je soupçonne que vous n'avez pas mis à jour la sortie après avoir changé le code.
Le tableau ne contient pas d'élément avec la valeur égale à 0. Donc, donc la condition de la boucle équivalente à p> invoque un comportement indéfini. p> Vous devez passer à la fonction également le nombre d'éléments que vous allez produire. par exemple p> et p> et dans l'écriture principale, par exemple p> Gardez à l'esprit que vous ne pouvez pas calculer la taille de la matrice transcédente dans la fonction. Le compilateur ajustement implicitement le paramètre du type de matrice au pointeur sur le type d'élément. P> CES est équivalent et déclarent la même fonction P> void arraySize( int arr[] );
void arraySize( int *arr );
@ B.Balamanigandan et quoi? Le tableau contient ces éléments. C'est ce que vous avez initial; avez essayé de faire.
J'açais un autre doute pourquoi nous ne pouvons pas calculer la taille dans le niveau de la méthode (c'est-à-dire marsedize)?
@ B.Balamanigandan ... Et pourquoi pensez-vous que ceci est un problème?
Désolé, je suis si mon contribution.
@ B.Balamanigandan, car un tableau transmis à une fonction est converti en pointeur à son premier élément. Donc, dans la fonction que vous traitez avec un pointeur.
Changez-le à:
#include <stdio.h> void arraySize(int arr[], int); int main() { int array[] = {15, 50, 34, 20, 10, 79, 100}; arraySize(array, sizeof(array)/sizeof(array[0])); //adding size of array as new argument return 0; } void arraySize(int arr[], int siz) { int i = 0; while(i<siz) { printf("The value of arr[%d] is %d \n", i, arr[i]); i++; } }
Vous lisez au-delà de la fin de la matrice. Il en résulte "comportement non défini" (Google à terme).
Les tableaux ne finissent pas comme par magie avec un NULL ou 0. Vous devez soit explicitement ajouter une telle valeur à la fin de la matrice ou transmettre la taille de la matrice dans la fonction.
Comment le compilateur se connaît-il de la taille du tableau code> adopté? Passez-le séparément en utilisant
Tailleof code> et ensuite l'utiliser.
@kaylum - D'accord mais pour l'indice 1 à 6, il doit donner la valeur appropriée, pourquoi elle n'a pas imprimé la valeur correcte? Pourriez-vous s'il vous plaît dire.
@ B.Balamanigandan Quelle est la la valeur correcte i>?
@Jabberwocky - {15, 50, 34, 20, 10, 79, 100}
@ B.Balamanigandan Mais il imprime les valeurs correctes pour les index 0 à 5. Toutes les autres valeurs sont lues d'au-delà de la matrice. La lecture au-delà de la fin d'une matrice est un comportement indéfini qui, dans ce cas, se traduit par des valeurs apparemment aléatoires.
Il semblerait que vous laissiez facilement la première ligne de production dans votre pâte.
@ B.Balamanigandan Vous avez changé le code. auparavant que vous aviez
i ++ code> avant le
printf code>. Ce qui entraînerait le premier élément de la matrice ne pas être imprimé exactement comme vous l'avez montré. Je soupçonne que vous n'avez pas mis à jour la sortie après avoir changé le code.
@ B.Balamanigandan Votre sortie ne correspond pas au programme. Veuillez lire ceci avant de poster votre prochaine question ici: Comment demander .
@ B.Balamanigandan Cet article A > Peut être intéressant pour vous.