-1
votes

Passez un tableau comme argument et imprimez l'élément de tableau dans le programme C

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


11 commentaires

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 adopté? Passez-le séparément en utilisant Tailleof 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 ?


@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 ++ avant le printf . 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 Peut être intéressant pour vous.


3 Réponses :


1
votes

Cela ne fonctionne pas car il ne peut pas simplement trouver la taille de la matrice comme ça. int ARR [] 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 en tant qu'oeur ou jusqu'à ce qu'il y ait une violation d'accès.

tandis que (ARR [I] ) 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] a la valeur 0 (qui est ensuite converti implicitement en false ). Coïncidence, cela signifie que vous pouvez utiliser 0 en tant que valeur sentinelle sur le signal que vous avez atteint la fin de la matrice: xxx

ceci va maintenant arrêter Impression lorsque le 0 est atteint et que vous n'avez plus de comportement non défini.



1
votes

Le tableau ne contient pas d'élément avec la valeur égale à 0. Donc, donc la condition de la boucle xxx pré>

équivalente à p> xxx pré>

invoque un comportement indéfini. p>

Vous devez passer à la fonction également le nombre d'éléments que vous allez produire. par exemple p> xxx pré>

et p> xxx pré>

et dans l'écriture principale, par exemple p> xxx pré >

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 );


5 commentaires

@ 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.



1
votes

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++;
    }
}


0 commentaires