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 des pointeurs


Sujet :

C

  1. #1
    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 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut Taille des pointeurs
    Salutations !

    Un peu honte de venir demander quelque chose d'aussi facile... Pas fait de C depuis un moment je voulais tester quelques trucs, et là, j'arrive un blocage. 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
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    #include "stdio.h"
    #include "stdlib.h"
    #include "string.h"
     
    int main(void)
    {
        int *pta=NULL;
        char *ch2=NULL;
        int a;
     
        // the bad line ?
        char ch1[15];
     
        strcpy(ch1 , "alo?");
        printf("ch1 = %s \n taille de ch1 = %d \n\n",ch1,sizeof(ch1));
     
        ch2 = "bonjour";
        printf("ch2 = %s \n taille de ch2 = %d \n\n",ch2,sizeof(ch2));
     
        a=48;
        printf("a = %d \n taille de a = %d \n\n",a,sizeof(a));
     
        // erreur
        *pta=89;
        printf("pta = %d \n taille de pta = %d \n\n",*pta,sizeof(pta));
     
        system("pause");
        return 0;
    }
    Mon problème : il plante après "//erreur", mais pas tout le temps... Le programme s'arrête. J'ai peut-être identifié la bad ligne, mais j'en doute, car c'est pas tout le temps justement... J'ai pas d'idée et j'ai pas de pote sous le coude pour lui demander, alors je m'adresse à vous.


    Et sinon, petite question sur la taille des pointeurs. De souvenir, il me semblait qu'un pointeur avait la taille de l'objet pointé. Ainsi, un pointeur sur int avait la taille d'un int, soit 4 (ce qui apparait dans mon exemple), et un pointeur sur char était donc de 1 (ce qui n'est pas le cas ici puis sizeof(ch2) me renvoit 4). J'ai faux alors ?

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Mon problème : il plante après "//erreur", mais pas tout le temps... Le programme s'arrête. J'ai peut-être identifié la bad ligne, mais j'en doute, car c'est pas tout le temps justement... J'ai pas d'idée et j'ai pas de pote sous le coude pour lui demander, alors je m'adresse à vous.
    pta vaut NULL, ce n'est pas une adresse valide à laquelle tu as le droit d'écrire. C'est bien une erreur dans le code.

    Citation Envoyé par Bktero Voir le message
    Et sinon, petite question sur la taille des pointeurs. De souvenir, il me semblait qu'un pointeur avait la taille de l'objet pointé. Ainsi, un pointeur sur int avait la taille d'un int, soit 4 (ce qui apparait dans mon exemple), et un pointeur sur char était donc de 1 (ce qui n'est pas le cas ici puis sizeof(ch2) me renvoit 4). J'ai faux alors ?
    Oui tu as faux, la taille d'un pointeur n'est pas lié à la taille du type pointé.

  3. #3
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    ton pta est égal à NULL quand tu essaie de lui attribuer une valeur...

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    En écrivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *pta = NULL;
    *pta = 58;
    Tu tentes d'écrire la valeur 58 à l'adresse 0. Ce qui est interdit.
    Si tu veux modifier la valeur de pta, il faut écrire :

    Et sinon, petite question sur la taille des pointeurs. De souvenir, il me semblait qu'un pointeur avait la taille de l'objet pointé. Ainsi, un pointeur sur int avait la taille d'un int, soit 4 (ce qui apparait dans mon exemple), et un pointeur sur char était donc de 1 (ce qui n'est pas le cas ici puis sizeof(ch2) me renvoit 4). J'ai faux alors ?
    Tes souvenir sont faux.

    Les pointeurs auront tous la même taille : la taille nécessaire pour connaitre avec certitude l'emplacement donnée en mémoire.

    Par exemple, je peux te dire, d'après la taille de tes pointeurs, que ton programme est compilé pour une architecture 32bits.

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Bonjour,

    Un pointeur est une variable qui contient l'adresse en mémoire d'un autre élément.

    Quand tu fais :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int * pta = NULL;
    *pta = 89;

    … tu essaies de déposer la valeur « 89 » à l'emplacement pointé par pta. Or, celui-ci ne pointe nulle part. Tu l'as initialisé à NULL, ce qui a de fortes chances de valoir 00000000, ce qui est manifestement en dehors de ton processus. D'où le plantage.

    Si ton pointeur n'est pas initialisé. La valeur qu'il contient au départ est indéterminée. Il se peut que cela tombe dans une zone mémoire qui t'est accordée, mais que tu n'auras pas réservé à cet effet pour autant. Le programme ne plantera pas tout de suite mais tu peux t'attendre à des effets bizarres quelques temps après.

    Et sinon, petite question sur la taille des pointeurs. De souvenir, il me semblait qu'un pointeur avait la taille de l'objet pointé. Ainsi, un pointeur sur int avait la taille d'un int, soit 4 (ce qui apparait dans mon exemple), et un pointeur sur char était donc de 1 (ce qui n'est pas le cas ici puis sizeof(ch2) me renvoit 4). J'ai faux alors ?
    Un pointeur a la taille … d'un pointeur ! c'est une variable comme une autre. Si tu fais sizeof(pta), tu obtiens donc 4 sur une machine 32 bits. Si tu veux obtenir la taille de l'objet pointé, il faut se référer à l'objet pointé : sizeof(*pta).

    Bon courage.

  6. #6
    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 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Ouah ! Comme ça répond trop vite sur le forum C !

    Merci à tous de me répondre aussi vite. Oui ue fois qu'on me dit "tiens, t'écris à l'adresse 0 toi ?", je comprend vite.... Il est possible que le "ca marche pas tout le temps" était un moment où il n'y avait pas le NULL. Et donc une zone accessible ou pas.

    Je présume que comme ça c'est mieux ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        pta=malloc(sizeof(int));
        *pta=89;
        printf("pta = %d \n taille de pta = %d \n\n",*pta,sizeof(pta));

    Par contre, j'aimis ça :
    et il n'a jamais planté à cette ligne là, seulement sur pta. Pourquoi ?


    Pour les tailles des pointeurs : ah d'accord ! Ca parait logique ! Je dois confondre en fait pour quand tu fais de l'arithmétique sur pointeur. Fais pta+1 lui rajoute en fait 4 car il faut se décaler d'un int en mémoire, je présume ?


    Encore merci. Ca m'énever à chaque j'arrête le C pendant quelques mois et que je recommence, je galère sur ce genre de petits trucs....

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Je présume que comme ça c'est mieux ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        pta=malloc(sizeof(int));
        *pta=89;
        printf("pta = %d \n taille de pta = %d \n\n",*pta,sizeof(pta));
    Oui, à ceci près que lorsque tu écris « taille de pta », c'est toujours la taille du pointeur que tu donnes et pas celle de l'int qu'il pointe et auquel tu as attribué la valeur « 89 ». C'est traître parce que sur les PC 32 bits, les int et les pointeurs ont la même taille.

    Par contre, j'aimis ça :
    et il n'a jamais planté à cette ligne là, seulement sur pta. Pourquoi ?
    Parce que, ce faisant, tu essaies de mettre à NULL ce qui est pointé par ch2, soit, ici, le premier caractère de ta chaîne. « NULL » n'est pas une expression de type char, mais elle est transtypée (castée) de manière implicite.

    Tu écris cependant dans une chaîne censée être constante et qui ne peut pas être modifiée. Cependant, elle fait partie de ton programme et se trouve dans l'espace alloué à ton processus. Ce n'est donc pas le système qui va râler pour cela.

    Note toutefois que les segfaults (au fait, sous quel système travailles-tu ?) ne sont pas des spécificités du langage C mais un mécanisme de protection du système d'exploitation qui s'appuie sur des fonctionnalités électroniques du micro-processeur. Sur des machines plus anciennes (très anciennes, même, aujourd'hui), de tels pointeurs fous pourraient aller écraser d'autres processus, voire le système d'exploitation lui-même.

    Pour les tailles des pointeurs : ah d'accord ! Ca parait logique ! Je dois confondre en fait pour quand tu fais de l'arithmétique sur pointeur. Fais pta+1 lui rajoute en fait 4 car il faut se décaler d'un int en mémoire, je présume ?
    C'est bien ça.

  8. #8
    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 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Parce que, ce faisant, tu essaies de mettre à NULL ce qui est pointé par ch2, soit, ici, le premier caractère de ta chaîne. « NULL » n'est pas une expression de type char, mais elle est transtypée (castée) de manière implicite.

    Tu écris cependant dans une chaîne censée être constante et qui ne peut pas être modifiée. Cependant, elle fait partie de ton programme et se trouve dans l'espace alloué à ton processus. Ce n'est donc pas le système qui va râler pour cela.
    Il va falloir que je cogite ça.
    Je mettrais '\0' comme premier élément de ma chaîne, donc ça fait une chaîne vide et qui dans un certain sens ne pointe sur "rien" ? Ca ne devrait pas agir sur le pointeur et non son contenu ?

    Le test à été fait sous Windows XP.

  9. #9
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Parce que, ce faisant, tu essaies de mettre à NULL ce qui est pointé par ch2, soit, ici, le premier caractère de ta chaîne. « NULL » n'est pas une expression de type char, mais elle est transtypée (castée) de manière implicite.
    Pardon ? Je pense que tu as lu un peu trop vite.

    Ne fait que créer un pointeur et l'initialisé à NULL. Il ne cherche pas à écrire dans ce qui est pointé.

    Sinon Bktero, non il n'y a aucun problème avec char *ch2=NULL; ni avec int *pta=NULL;
    Ces deux codes sont tout à fait correct et crée un pointeur initialisé à NULL.

    Ça coince sur *pta=89; car là tu cherches à écrire une valeur dans un pointeur NULL, ce qui n'est pas correct.

    Par contre ch2 = "bonjour"; ne pose pas de problème car ici tu ne cherches pas écrire à l'adresse contenue dans le pointeur mais tu changes la valeur du pointeur (et non de ce qui est pointé), le pointeur contient alors l'adresse de "bonjour" et non plus NULL.

  10. #10
    Invité(e)
    Invité(e)
    Par défaut
    Pour compléter la réponse de gl, il ne faut pas perdre de vu que :
    est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *toto;
    toto = NULL;
    mais pas à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *toto;
    *toto = NULL;

  11. #11
    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 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Ah oui je comprend ! Merci à vous tous




    PS : j'ai honte de dire que je suis en 5e année d'école d'ingé electronique / info indus



    EDIT : oh mais le bilgeux ! Je croyais avoir écrit maisje n'ai pas mis d'étoile, donc il modifie le pointeur et le non le contenu. Ce qui diffère de . Et donc je comprend encore mieux ^^

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 372
    Points : 23 628
    Points
    23 628
    Par défaut
    Citation Envoyé par gl Voir le message
    Pardon ? Je pense que tu as lu un peu trop vite.

    Oups ! J'ai posté avant le café et je n'aurais pas dû. J'ai complètement fait abstraction du type à côté.

    Merci pour ta vigilance !

  13. #13
    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 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Hop une petite balise "résolu".

    Merci à tous

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

Discussions similaires

  1. taille des pointeurs et des entiers
    Par luckyvae dans le forum C++
    Réponses: 15
    Dernier message: 09/03/2010, 10h18
  2. [Langage] Taille des pointeurs
    Par méphistopheles dans le forum Langage
    Réponses: 7
    Dernier message: 27/11/2008, 10h14
  3. Taille des pointeurs
    Par j0o0 dans le forum C
    Réponses: 12
    Dernier message: 08/09/2007, 13h00
  4. [info] taille des adresses des pointeurs Java
    Par TabrisLeFol dans le forum Général Java
    Réponses: 11
    Dernier message: 14/02/2006, 13h24
  5. Taille des champs proportionnelle...
    Par Depteam1 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 09/08/2002, 11h48

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