IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

pourquoi sizeof(tab)/sizeof(int) retourne la taille du tableau


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut pourquoi sizeof(tab)/sizeof(int) retourne la taille du tableau
    Bonjour à tous,

    voila si je fais ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main(){
    int tab[10] = {0};
    int taille_du_tableau = sizeof(tab)/sizeof(int);
     
    }

    je récupère bien la taille du tableau mais je ne comprend pas du tout pourquoi. tab est sensé etre l'adresse ou se trouve le premier élément. L'adresse est sur 6 octets, donc si je fais sizeof(tab) je devrais avoir 6, or il me retourne 40. Quelqu'un sait pourquoi ?

    Merci d'avance pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Il est vrai que tab représente une adresse (très précisément l'adresse de la première case du tableau). Et donc si tu écris ceci

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main() {
    	int tab[10] = {0};
    	int taille_du_tableau = taille(tab);
    }
     
    int taille(int *tab /* ou même int tab[10] */) {
    	return sizeof(tab);
    }

    Tu obtiendras 4 ou 8 selon que tu es en 32 ou 64 bits (pourquoi tu as dit "6" ça... ?)

    Mais quand tu te trouves dans le scope qui a défini tab, alors (cas particulier) je pense que sizeof arrive à en quelque sorte "détecter" qu'il s'agit d'un tableau et te renvoie la vraie taille.
    D'ailleurs si tu écris printf("%d %d\n", taille(tab), sizeof(tab)) tu auras à l'écran "8 40".
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut
    Merci beaucoup pour ta réponse.

    j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int taille(int *t)
    {
    	printf("adresse = %p\n",t);
    	return sizeof(t);
    }
    et le compilateur me retourne :
    adresse = 0x7ffecd291de0
    taille = 8

    comme tu peux le voir, l'adresse est sur 6 octets (bien que je suis en 64 bits), as tu une idée ?

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Il est vrai que tab représente une adresse (très précisément l'adresse de la première case du tableau).
    Je trouve cette explication un peu imprécise et du coup trompeuse

    tab est un tableau et rien d'autre. tab est un ensemble de 10 int et il a donc la taille de 10 int. Si int a une taille de 4 alors tab a une taille de 40. En revanche, quand tu utilises la variable tab, elle est presque toujours converti en une adresse sur son premier élément (en particulier quand tu passes tab à une fonction), ça c'est tout à fait exact. tab est et reste toujours un tableau, mais parfois le compilateur interprète ce mot différemment.

    Il y a longtemps j'avais écrit un article sur ce sujet https://gradot.wordpress.com/2012/08...ointeurs-en-c/ Voir notamment la partie 2.

  5. #5
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut
    tab est un pointeur qui va prendre 10 zones mémoires dans la pile. tab représente la premiere zone mémoire, (tab + 1) la seconde ... donc l'explication ne me parait pas tellement imprécise ou alors quelque chose m'échappe mais on m'a toujours dis ca en cours.

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 274
    Points : 56
    Points
    56
    Par défaut
    Ok je viens de lire ton lien, et je tombe un peu de haut car on ne me l'a jamais appris comme ca ...
    merci de l'info !

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cosmoff Voir le message
    tab est un pointeur qui va prendre 10 zones mémoires dans la pile.
    Non tab est un tableau, et un tableau n'est pas un pointeur. Mais souvent tab est converti en pointeur vers son premier élément. Mon message ci-dessus peut faire un peu rigoriste, mais en fait tant qu'on n'a pas pleinement saisi la différence entre tableau et pointeur, il faut vraiment éviter les raccourcis car les approximations nuisent à la compréhension complète.

    Ok je viens de lire ton lien, et je tombe un peu de haut car on ne me l'a jamais appris comme ca ...
    Moi aussi j'étais tombé de haut...

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 631
    Points : 30 865
    Points
    30 865
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cosmoff Voir le message
    comme tu peux le voir, l'adresse est sur 6 octets (bien que je suis en 64 bits), as tu une idée ?
    Euh non, l'adresse s'affiche sur 6 octets mais l'adresse d'un pointeur n'a rien à voir avec sa taille. C'est un peu comme si tu disais "la maison du 56 rue machin est deux fois plus grande que la maison du 28".
    L'espace occupé pour afficher un nombre n'a pas de rapport avec la valeur que représente le nombre !!!

    Citation Envoyé par Bktero Voir le message
    Je trouve cette explication un peu imprécise et du coup trompeuse
    Moui, je me suis un peu vautré dans mon explication. Un tableau ce n'est pas un pointeur.

    Citation Envoyé par Bktero Voir le message
    En revanche, quand tu utilises la variable tab, elle est presque toujours converti en une adresse sur son premier élément (en particulier quand tu passes tab à une fonction)
    C'est vrai que dit comme ça c'est bien plus exact. tab est un tableau mais quand on le passe à une fonction il est converti en pointeur c'est vrai que c'est mieux dit et ça représente mieux la réalité de la chose
    Surtout quand on rajoute ensuite que malgré l'usage de parenthèses, sizeof() est un opérateur et non une fonction.

    Citation Envoyé par cosmoff Voir le message
    mais on m'a toujours dis ca en cours.
    Il faut savoir que l'apprentissage de quoi que ce soit passe toujours par le biais de raccourcis destinés à simplifier la notion à aprendre pour la rendre plus accessible mais que cette simplification fausse alors la réalité profonde de la chose enseignée. Ainsi chaque étape de l'apprentissage oblige toujours par désapprendre ce qui a été enseigné aupravant.
    Tu veux des exemples ? On t'a appris que la Terre est ronde. Ben c'est faux. C'est certes suffisant pour le capitaine qui calcule son cap mais pour le cosmographe qui doit produire des cartes précises, lui on lui enseigne qu'elle a en réalité la forme d'une patate. On t'a appris que la racine d'un nombre ne s'applique que pour les nombres posititifs. C'est certes vrai pour l'architecte qui doit faire son plan et ses quotes mais le physiciens qui doit produire des circuits sera content d'avoir les complexes pour calculer des racines de négatifs et ainsi calculer son impédance dans le triangle de Fresnel. La vitesse d'un corps en chute libre depuis une hauteur "h" et soumis à une accélération gravitationnelle "g" est donnée par la formule v=racine(2gh). Toutefois cette formule se révèlera fausse quand on approchera la vitesse de la lumière.
    Et donc en C on commence par te dire qu'un tableau c'est un pointeur parce que c'est plus simple pour comprendre les exemples puis quand tu progresses là tu apprends que ce n'est pas tout à fait vrai...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Ce comportement découle surtout du fait que le type de tab n'est pas int * mais int [10]. Tu peux t'en convaincre en exécutant printf("%zu, %zu\n", sizeof(int *), sizeof(int [10])).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Retourner la taille d'un fichier
    Par boubz013 dans le forum Débuter
    Réponses: 7
    Dernier message: 23/02/2010, 16h07
  2. Réponses: 1
    Dernier message: 04/02/2009, 03h54
  3. [WinCE/PDA] Pourquoi touche TAB ne change pas le focus ?
    Par zitoun dans le forum Windows Mobile
    Réponses: 7
    Dernier message: 24/04/2006, 10h26
  4. Réponses: 1
    Dernier message: 07/02/2006, 13h52
  5. [SGBD] [PHP/MySQL Query]Quelle est la taille du tableau retourné?
    Par Jean_Benoit dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 07/10/2005, 20h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo