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 :

Taille d'un pointeur


Sujet :

C

  1. #1
    Membre habitué Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Points : 199
    Points
    199
    Par défaut Taille d'un pointeur
    Bonjour,
    Je veux écrire un programme qui affiche la taille d'un pointeur sur différents types.
    voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    int main(void)
    {
    	int *p = NULL;
    	char *c = NULL;
    	double *z = NULL;
     
    	printf("La taille d'un pointeur sur un entier est :%i\n", sizeof *p);
    	printf("La taille d'un pointeur sur un caractere est :%i\n", sizeof *c);
    	printf("La taille d'un pointeur sur un double est :%i\n", sizeof *z);
    	return 0;
    }
    Le resultat est 4 , 1 et 8
    ma question est très simple , est-ce la bonne manière de procéder pour afficher la taille ?
    Merci

  2. #2
    Membre habitué Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Points : 199
    Points
    199
    Par défaut
    Et sur ce code les valeurs sont-elles normales ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    int main(void)
    {
    	int leNb1 = 1;
    	int *lePt1;
    	lePt1 = &leNb1;
    	printf("%d\n", leNb1); /* affiche 1 */
    	printf("%d\n", lePt1); /* affiche 1245052 */
    	printf("%d\n", lePt1 + 1); /* afficha 1245046 */
    	printf("%d\n", *lePt1); /* affiche 1 */
    	printf("%d\n", *lePt1 + 1); /* affiche 2 */
    	printf("%d\n", *(lePt1+1)); /* affiche 1245120 */
    	return 0;
    }

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Citation Envoyé par emprex Voir le message
    Bonjour,
    Je veux écrire un programme qui affiche la taille d'un pointeur sur différents types.
    voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    int main(void)
    {
    	int *p = NULL;
    	char *c = NULL;
    	double *z = NULL;
     
    	printf("La taille d'un pointeur sur un entier est :%i\n", sizeof *p);
    	printf("La taille d'un pointeur sur un caractere est :%i\n", sizeof *c);
    	printf("La taille d'un pointeur sur un double est :%i\n", sizeof *z);
    	return 0;
    }
    Le resultat est 4 , 1 et 8
    ma question est très simple , est-ce la bonne manière de procéder pour afficher la taille ?
    Merci
    Non. ceci te donne la taille des objets pointés. Pour avoir la taiile des pointeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	printf("La taille d'un pointeur sur un entier est :%i\n", sizeof p);
    	printf("La taille d'un pointeur sur un caractere est :%i\n", sizeof c);
    	printf("La taille d'un pointeur sur un double est :%i\n", sizeof z);

  4. #4
    Membre habitué Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Points : 199
    Points
    199
    Par défaut
    Du coup tous les pointeurs ont la même taille.

  5. #5
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par emprex
    Du coup tous les pointeurs ont la même taille.
    En théorie : non.

  6. #6
    Membre habitué Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Points : 199
    Points
    199
    Par défaut
    Lorsque j'execute le code les valeurs sont 4 4 4

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par emprex Voir le message
    Lorsque j'execute le code les valeurs sont 4 4 4
    Ce qui n'est pas garanti. Les seules choses de garanties
    - c'est qu'on peut stocker un pointeur vers n'importe quel type dans un void* ou dans un (signed/unsigned/) char* et le reconvertir dans le type initial sans perte de valeur;
    - c'est qu'on peut avoir des pointeurs vers des types incomplets (donc en pratique tous les pointeurs vers des types pouvant etre incomplets -- struct, union -- ont la meme taille meme si on peut imaginer des cas tordus conformes ne respectant pas cette contrainte -- genre les pointeurs vers les struct dont le nom de tag commence par a ont une taille de 4, les autres une taille de 8).

  8. #8
    Membre régulier
    Profil pro
    Responsable de projet
    Inscrit en
    Décembre 2005
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable de projet

    Informations forums :
    Inscription : Décembre 2005
    Messages : 97
    Points : 110
    Points
    110
    Par défaut
    Melem pourquoi les pointeur ne doivent pas tous faire la meme taille ?

    sachant qu'il contient une adresse il devrai car les adresse font la meme taille non ?

  9. #9
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par iMaTh
    Melem pourquoi les pointeur ne doivent pas tous faire la meme taille ?
    Pas ne doivent pas tous avoir la même taille, mais ne sont pas tous tenus d'avoir la même taille.
    Citation Envoyé par iMaTh
    sachant qu'il contient une adresse il devrait car les adresse font la meme taille non ?
    Ben justement : non. La gestion de la mémoire est une tâche confiée à l'OS. Adresse ne signifie pas forcément adresse physique, ca signifie adresse. Le système effectue éventuellement une certaine redirection pour convertir les adresses en adresse physique ...

  10. #10
    Membre régulier
    Profil pro
    Responsable de projet
    Inscrit en
    Décembre 2005
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Responsable de projet

    Informations forums :
    Inscription : Décembre 2005
    Messages : 97
    Points : 110
    Points
    110
    Par défaut
    donc les pointeurs pointent sur les adresse virtuel qui sont par la suite redirigé vers les adresses physiques si j'ai bien compris.

    vachement complex l'informatique.

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par emprex Voir le message
    Je veux écrire un programme qui affiche la taille d'un pointeur sur différents types.
    <...>est-ce la bonne manière de procéder pour afficher la taille ?
    Non. La taille d'un pointeur p, c'est sizeof p. Ce que tu affiches là, c'est la talle de l'objet pointé.

    D'autre part, sizeof retourne un size_t. alors soit tu utilises "%z" pour l'afficher si tu es sous C99, soit "%u" et un cast (unsigned) pour garantir la portabilité, ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    La taille d'un pointeur sur un entier est :4
    La taille d'un pointeur sur un caractere est :4
    La taille d'un pointeur sur un double est :4
     
    Press ENTER to continue.
    sur mamachine, avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    #include <stdio.h>
     
    int main (void)
    {
       int *p;
       char *c;
       double *z;
     
       printf ("La taille d'un pointeur sur un entier est :%u\n",
               (unsigned) sizeof p);
       printf ("La taille d'un pointeur sur un caractere est :%u\n",
               (unsigned) sizeof c);
       printf ("La taille d'un pointeur sur un double est :%u\n",
               (unsigned) sizeof z);
       return 0;
    }

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par emprex Voir le message
    Et sur ce code les valeurs sont-elles normales ?
    Le code est incorrect. Je l'ai corrigé et commenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #include <stdio.h>
    int main(void)
    {
    	int leNb1 = 1;
    	int *lePt1;
    	lePt1 = &leNb1;
     
    /* affiche 1 : OK */
    	printf("%d\n", leNb1);
     
    /* affiche 1245052 : adresse : "%p" */
    	printf("%p\n", (void *)lePt1);
     
    /* affiche 1245046 : adresse : "%p" */
    	printf("%p\n", (void *)(lePt1 + 1));
     
    /* affiche 1 : OK*/
    	printf("%d\n", *lePt1);
     
    /* affiche 2 : OK  */
    	printf("%d\n", *lePt1 + 1);
     
    /* affiche 1245120 : Comportement indefini */
    	printf("%d\n", *(lePt1+1));
     
    	return 0;
    }
    Ca donne chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    1
    0022FF70
    0022FF74
    1
    2
    16384
     
    Press ENTER to continue.
    pose des questions si tu ne comprends pas.

  13. #13
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par emprex Voir le message
    Du coup tous les pointeurs ont la même taille.
    Sur ta machine, oui, c'est tout à fait possible. Mais il ne faut pas en tirer une généralité.

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par iMaTh Voir le message
    donc les pointeurs pointent sur les adresse virtuel qui sont par la suite redirigé vers les adresses physiques si j'ai bien compris.

    vachement complex l'informatique.
    Oui, c'est le prix à payer pour que les processus soient indépendants et qu'en cas de débordement de mémoire, ils ne viennent pas empiéter sur les adresses du processus voisin.

    C'est grâce à ça que les OS sont multi-processus.

  15. #15
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par iMaTh Voir le message
    donc les pointeurs pointent sur les adresse virtuel qui sont par la suite redirigé vers les adresses physiques si j'ai bien compris.

    vachement complex l'informatique.
    Non les pointeurs contiennent des adresses. Si ton programme s'exécute sous un système d'exploitation ce dernier va interpréter ces adresses selon sa manière de gérer les adresses. Mais évidemment si tu développes un OS tu as accès à la mémoire physique, qu'il sera alors de ton devoir de gérer afin que les programmes utilisateurs n'ont en pas directement accès (sinon c'est l'anarchie, comme au temps du DOS).

  16. #16
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par iMaTh Voir le message
    Melem pourquoi les pointeur ne doivent pas tous faire la meme taille ?
    D'un point de vue architecture, le byte est la taille d'un caractere. Cette definition vient d'un temps ou on n'imaginait pas mettre tous les ideogrammes comme caracteres, encore moins une union de tous les charsets dans Unicode, donc le byte est relativement petit: 6, 7, 8 ou 9 bits sont des tailles qui ont ete utilisees. Il y a en des architectures où l'unité la plus petite ayant une adresse est le mot (de 16, 18, 24, 32, 36 ou 60 bits) plutôt que le byte. Celle-ci peuvent ne pas avoir d'instructions manipulant des donnes de taille plus petite que le mot (donc il n'y a pas de notion de byte provenant de l'architecture, le systeme peut en avoir une et pour les manipuler, il faut agir au niveau du bit), ou en voir mais ne favoriser aucune taille (a nouveau, ce qu'est un byte alors provient de l'exterieur).

    De nos jours, les architectures adressables par byte sont archi-dominantes sur le domaine des machines ayant une vocation générale, mais ce n'était pas le cas dans les années 70 -- au moment où le C évoluait -- et, même si on savait qu'elles avaient vraisemblablement peu d'avenir, les machines adressables par mot étaient loin d'être anecdotiques durant les années 80 -- au moment où la normalisation du C prenait place.

    De son origine, le C suppose une machine adressable par byte: il faut pouvoir faire des pointeurs sur chacun des bytes de la memoire. Il y a deux techniques possibles pour y arriver sur une machine adressable par mot.

    1/ Etendre la taille de ce que le C considère un byte pour en faire la même que celle d'un mot -- c'est la technique utilisée de nos jours sur les DSP qui sont les seules machines adressables par mot de conception récente. On se retrouve avec le char (ou le byte) du C qui ne fait pas la meme taille que le byte du systeme, mais ce n'est pas grave: les manipulations de caracteres ne sont pas la raison pour laquelle on utilise des DSP.

    2/ Faire en sorte qu'un pointeur vers char contienne non seulement l'adresse du mot, mais aussi une indication du byte dans le mot -- et pour ça il faut des pointeurs vers char qui sont plus grand que les adresses. Un char* ou un void( contient un pointeur vers un mot (a priori, un unsigned*), plus une indication du caractere designe (un petit indice).

Discussions similaires

  1. Calcul de taille entre 2 pointeurs
    Par Fooshi dans le forum C
    Réponses: 6
    Dernier message: 12/05/2010, 12h22
  2. Réponses: 2
    Dernier message: 23/03/2010, 21h40
  3. Taille d'un pointeur de fonction (delegate)
    Par yocks dans le forum C#
    Réponses: 2
    Dernier message: 13/05/2009, 10h07
  4. Taille d'un pointeur NULL
    Par Bakura dans le forum C++
    Réponses: 28
    Dernier message: 03/03/2008, 02h51
  5. Taille d'un pointeur
    Par oranoutan dans le forum Débuter
    Réponses: 9
    Dernier message: 07/06/2007, 23h06

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