Error get array size

Bonjour,

Je cherche des réponses sur l'obtention de la taille d'un tableau de caractères. Voici mon code:

#define MAX_NAME_CHAR 25
#define MAX_TEL_CHAR 10

typedef struct profile
{
 signed char name[MAX_NAME_CHAR];
 signed char tel[MAX_TEL_CHAR];
} profil;

void print_rep(profil myRep[]);

int main(int argc, char *argv[])
{
 profil myRep[1];
 return 1;
}

void print_rep(profil myRep[])
{
 int s1, s2, size;
 s1 = sizeof(myRep);
 s2 = sizeof(myRep[0]);
 size = s1 / s2;
 return;
}


À la compilation :

exercice.c:31:20: warning: 'sizeof' on array function parameter 'myRep' will return size of 'profil *' {aka 'struct profile *'} [-Wsizeof-array-argument]
   31 |         s1 = sizeof(myRep);
      |                    ^
exercice.c:27:23: note: declared here
   27 | void print_rep(profil myRep[])


Cette erreur vient lorsque j'essaye de récupérer la taille de mon tableau et je n'arrive pas a corriger ce problème.
Merci pour le personnes qui prendront le temps de m'aider :-).

3 réponses

  1. Bonjour,

    En fait, une fonction ne peut pas recevoir en paramètre un tableau.

    Quand tu écris
    print_rep(profil myRep[])
    , en fait la fonction ne reçoit par un tableau mais un pointeur sur son premier élément, c'est équivalent à
    print_rep(profil *myRep)
    . Un pointeur s'utilise comme un tableau, et on ne s'en rend pas compte.

    Si tu fais tes
    sizeof
    dans
    main()
    , ils auront les bonnes valeurs car dans
    main()
    , c'est bien un tableau.

    Le seul moyen de transmettre la taille, c'est d'utiliser un paramètre supplémentaire pour la transmettre à la fonction.
    1. Contributeur
      bonjour,
      il me semble que le message n'est qu'un avertissement.
      quelle valeur obtiens-tu pour la variable
      size
      ?
      tu écris vouloir obtenir la taille d'un tableau de caractères. en quelle unité veux-tu l'obtenir? que vas-tu faire avec cette taille?
      1. Modérateur
        Bonjour,

        Les messages sont effectivement sont effectivement juste des avertissements, qui indique la taille récupérée n'est pas la place (en octet) occupée par le tableau mais la taille du pointeur et donc probablement une erreur de programmation. En effet, comme la taille du pointeur ne dépend pas de la taille du tableau (il fait toujours la taille d'une adresse de mémoire, e.g. 64 bits sur une architecture 64 bits), cet avertissement signifie que le
        sizeof
        incriminé a un intérêt limité...

        C'est pourquoi comme le dit Dalfab, il faut souvent passer à une fonction qui manipule un tableau le nombre d'éléments stockés dans le tableau et ainsi lui signifie jusqu'où elle peut le lire, car le pointeur seul ne véhicule pas la taille du bloc mémoire pointé. Personnellement je recommande de n'utiliser dans des fonctions que l'utilisation de pointeurs (sans oublier de préciser
        const
        si c'est accès en lecture seule).

        #include <stdio.h>
        
        void print_tab(const int * tab, size_t num_elements) {
            for (size_t i = 0; i < num_elements; i++) {
                printf("%d\n", tab[i]);
            }   
        }                         
                                  
        int main(){
            int tab[10];
            for (size_t i = 0; i < 10; i++) {
                tab[i] = i;
            }   
            print_tab(tab, sizeof(tab) / sizeof(tab[0])); // ou sizeof(tab) / sizeof(int)
            return 0;
        }


        Tu écris vouloir obtenir la taille d'un tableau de caractères. en quelle unité veux-tu l'obtenir ? Que vas-tu faire avec cette taille ?

        Je pense qu'hadrien c'est un peu mélangé les pinceaux au moment d'écrire son message. Dans le code qu'il partage l23 dans le message #1, on voit que l'objectif semblait être de calculer le nombre de
        struct profile
        stockés dans
        myRep
        , sans doute en vue d'itérer sur chacun d'entre eux.
    2. Merci beaucoup pour votre aide. J'ai passé le contenu de la fonction dans le
      main
      et cela marche parfaitement.

      Bonne journée