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

Double Possible:
Sizeof un tableau dans le langage de programmation C?
Pourquoi un tableau C a-t-il une valeur sizeof() incorrecte lorsqu'il est passé à une fonction?

Voir le code ci-dessous et me suggérer que quelle est la différence du mot-clé " sizeof " 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: %dn",sizeof(arr));
    printf("Length: %dn",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 ceci:

La sortie est:

Longueur: 10

Longueur: 5

Longueur: 2

Longueur: 1

Pourquoi je reçois comme ça; si je veux prendre les données entières d'un tableau à un autre tableau, Comment puis-je faire?

Suggère - moi si quelqu'un sait.

41
c
demandé sur Bo Persson 2012-02-23 16:26:38

3 réponses

Les tableaux se désintègrent 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 comme un 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 de véritables tableaux:

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

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

Remarque que sizeof vous donne la taille en unités de char, c'est pourquoi la division par ce qui est essentiellement sizeof (int) est nécessaire, ou si vous voulez obtenir un moyen trop élevé valeur.

Notez Également, comme un point d'intérêt et de la 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 cast (par exemple sizeof (int)). Vous pouvez souvent vous en sortir sans nommer les types réels, en faisant sizeof sur les données à la place.

62
répondu unwind 2014-11-18 10:29:56

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

3
répondu Julien May 2012-02-23 12:31:20

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

1
répondu CoolStraw 2012-02-23 12:28:46