web-dev-qa-db-fra.com

Comment obtenir la longueur d'un tableau en C? "Sizeof" est-il une solution?

Duplicate possible:
Taille d’un tableau dans le langage de programmation C?
Pourquoi un C-Array a-t-il une mauvaise valeur sizeof () quand il est passé à une fonction?

Voir le code ci-dessous et suggérez-moi que quelle est la différence de " sizeof " mot-clé quand j'ai utilisé comme ceci:

#include<stdio.h>
#include<conio.h>
void show(int ar[]);
void main()
{
    int arr[]={1,2,3,4,5};
    clrscr();
    printf("Length: %d\n",sizeof(arr));
    printf("Length: %d\n",sizeof(arr)/sizeof(int));
    show(arr);
    getch();
}
void show(int ar[])
{
   printf("Length: %d", sizeof(ar));
   printf("Length: %d", sizeof(ar)/sizeof(int));
}

Mais la sortie est comme ça:

La sortie est:

Longueur: 10

Longueur: 5

Longueur: 2

Longueur: 1

pourquoi je deviens comme ça; Si je veux prendre toutes les données d'un tableau à un autre, comment puis-je le faire?

Suggérez-moi si quelqu'un sait.

42
alishaik786

Les tableaux se décomposent en pointeurs dans les appels de fonction. Il n'est pas possible de calculer la taille d'un tableau qui n'est représenté que sous forme de pointeur, y compris en utilisant sizeof.

Vous devez ajouter un argument explicite:

void show(int *data, size_t count);

Dans l'appel, vous pouvez utiliser sizeof pour calculer le nombre d'éléments, pour les tableaux réels:

int arr[] = { 1,2,3,4,5 };

show(arr, sizeof arr / sizeof *arr);

Notez que sizeof vous donne la taille en unités de char, ce qui explique pourquoi la division par ce qui est essentiellement sizeof (int) est nécessaire, sinon vous obtiendrez un résultat trop élevé. valeur.

Notez également, en tant que point d’intérêt et de propreté, que sizeof est pas une fonction. Les parenthèses ne sont nécessaires que lorsque l'argument est un nom de type, car l'argument est alors une expression de type prédictif (par exemple, sizeof (int)). Vous pouvez souvent vous en sortir sans nommer les types réels, en faisant plutôt sizeof sur les données.

62
unwind

C’est la raison pour laquelle, lors de l’écriture d’une fonction prenant un tableau, deux paramètres sont déclarés. l'un qui est un pointeur sur le tableau, l'autre qui définit la taille du tableau.

3
Julien May

show () prend l'adresse du tableau qui est stocké sur 2 octets. Pensez-y comme int * ar.

1
CoolStraw