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 :

Problème avec malloc


Sujet :

C

  1. #21
    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
    Envoyé par Flynet
    En faisant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     x = (long long) 0x40000000 << 2;
    le 0x40000000 est transformé en long long de même que le 2 de manière implicite. Du coup le résultat est bien stocké.
    Oui. Tout calcul s'exécute dans le type le plus large des opérandes impliqués dans le calcul.
    Tout dépend de l'opérateur en cause.
    Dans le cas de >> ou <<, chaque opérande subit la promotion entière mais il n'y a pas lieu de déterminer un type commun pour réaliser l'opération. Le résultat de l'opération est du type de l'opérande de gauche (après promotion). Le 2 est (et reste après promotion) un int.

    Ceci étant, ça ne change rien sur le résultat final.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  2. #22
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2010
    Messages : 87
    Points : 62
    Points
    62
    Par défaut
    re ++

    @Sve@r

    tu sais pour quoi j'ai poster ici ?, parce que je trouve un peu dizard qu'une discution simple qui commence avec une question "Problème avec malloc" et se termine par le traitement des données et c'est ça qui ma chauffé , vous donnez des exemples pour un opérateur "<<" avec une variable long long, en plus avec une valeur trop long et comment en (hexadécimal) dit moi est-ce que tu te trouve ça normale pour un personne qui ne sais meme pas quoi le pointeur normalement pour lui mieux comprendre un opérateur "<<" il faut lui donner l'exemple avec la petite variable et une valeur en binaire et la meme chose pour le traitement il faut savoir le quel cpu a-t-il 32bit ou 64 bit avant de vous lencer vos exemples avec une variable de long long et meme pour la valeur en hexadécimal, normalement pour lui mieux comprendre le traitement, exemple qu'il a un cpu 32bit on lui donne un exemple avec une variable maximum 32bit,et meme pour positionner le bit"Z" de meieux lui donner une valeur en décimal comme nous l'apprend dans les documment un long fait maximum(4294967295) et dit lui que la valeur 4294967295 + 1 = (bitz =1) et quand le bit"Z" est positionné le cpu initialise automatiquement notre variable a zéro (ça veut dire pas que notre résultat égal a zéro) car c'est trop claire que (4294967295 + 1 = 4294967296 ) en 64bit

    je revient maintenant pour répondre a @Sve@r mais en mode pas a pas parce que( je répète encore que je suis quel un qui ne sais pas bien le français)c'est juste pour vous pensez que je suis quel qu'un qui ne connais pas bien le français (je ne sais pas écrire j'oublier des mots j'inverse les mots j'écris mes messages a l'aide d'un traducteur) mais pas les pointeurs/variables/tableaux

    non
    pour moi c'est oui

    Le nom d'un tableau est équivalent à l'adresse de son premier élément
    merci pour le confirmation a ce que j'ai déja dit, donc si le tableau est équivalent a l'adresse de son premier élément,et ben le pointeur est aussi équivalent a une adresse pointe pour le premier élément,voila pour quoi je lui écris "#define pointeur 0x956000" (pas pour l'utiliser dans sont programme) mais juste un exemple pour l'aider a comprendre que le pointeur ni qu'une adresse présenté comme mon (p/pl/pointer) ,toi et moi on le sait comment le system gérer ces adresses mais lui il commence maintenant a comprendre les ppointeur

    Hum, es-tu certain que les mots vont bien de ton cerveau au clavier sans altération intermédiaire due à un facteur externe indépendant de ta volonté ???
    tres certain et je te conseillé de tu te documenter bien avec des document qui t'aider pour approche de hardware cpu/ram/et aussi bien le langage assembleur parce que le langage C c'est fait juste pour simplifier les choses exemple pour quel qu'un comme toi puisse programmer crée des application pour étres un développeur trop vie , quoi je vais te donner un exemple de comment le langage C a simplifier une chose pour vous , par exemple au lieu de écrire un pointeur de pointeur il te laisse écrire un seul pointeur et lui s'occupe de l'autre pointeur lolll

    Superbe !!! Dans ton exemple, pointeur n'est pas une variable mais une macro. Tu ne peux pas lui mettre de valeur !!!
    attention ne mélanger pas les chose moi j'ai dit que le 'nom' lui meme est une variable ce n'est pas la meme chose et merci encore une fois pour la confirmation tu a dit que ( pointeur n'est pas une variable mais une macrom ) donc c'est juste ce que je l'ai met dans mon l'exempble "#define pointer 0x956000"(toi et moi on le sais que impossible de definir une adresse de pointeur ) j'ai met ça juste pour lui comprendre que le pointeur ni qu'une équivalent de s'adresse et que le system qui la definera et pas moi avec le "#define pointer 0x956000" je vais maintenant réponde a ( pointeur n'est pas une variable) ok un poiteur est équivalent a une adresse et que ce n'est pas une variable, donc une adresse est une valeur exemple que cette valeur est de "0x956000" ou pense-tu qu'on va placer cette valeur dans ton poche ?, donc on place cette valeur dans une variale/la quelle?/ben celle que tu la déclaré comme nom de ton pointeur/tableau/variable

    Magnifique. Tu stockes un caractère dans une zone prévue pour recevoir une adresse !!!
    ici je ne parle pas de comment apprendre l'affection des valeurs, c'est tres claire que j'ai répondu juste pour les pointeurs

    Oui, avec tes explications nébuleuses, il en aura effectivement super besoin de "chance" !!!
    oui surement mais pas moi qui te donne la chance

  3. #23
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par PIC16F877A Voir le message
    re ++

    @Sve@r

    tu sais pour quoi j'ai poster ici ?, parce que je trouve un peu dizard qu'une discution simple qui commence avec une question "Problème avec malloc" et se termine par le traitement des données et c'est ça qui ma chauffé
    Oui ben oui parfois ça arrive qu'une discussion commencée sur un problème se transforme parce que l'intervenant avais mal perçu l'origine ou parce qu'il s'intéresse et a embrayé sur autre chose ou plein d'autres raisons valables...

    Citation Envoyé par PIC16F877A Voir le message
    , vous donnez des exemples pour un opérateur "<<" avec une variable long long, en plus avec une valeur trop long et comment en (hexadécimal) dit moi est-ce que tu te trouve ça normale pour un personne qui ne sais meme pas quoi le pointeur
    Quand j'ai commencé l'informatique, j'ai appris la numération binaire et hexa, la conversion, le calcul et je connaissais rien aux pointeurs

    Citation Envoyé par PIC16F877A Voir le message
    normalement pour lui mieux comprendre un opérateur "<<" il faut lui donner l'exemple avec la petite variable et une valeur en binaire
    Exact. Mais bon c'est lui qui a utilisé cet exemple et cette valeur donc j'ai préféré reprendre avec. Mais j'ai aussi donné un exemple de calcul court avec 8 bits (surtout parce que ça me gonflait d'aligner 40 zéros en fait)

    Citation Envoyé par PIC16F877A Voir le message
    je revient maintenant pour répondre a @Sve@r mais en mode pas a pas parce que( je répète encore que je suis quel un qui ne sais pas bien le français)c'est juste pour vous pensez que je suis quel qu'un qui ne connais pas bien le français (je ne sais pas écrire j'oublier des mots j'inverse les mots j'écris mes messages a l'aide d'un traducteur) mais pas les pointeurs/variables/tableaux
    Ok, tu n'es pas français. Ca c'est un élément que je ne savais pas.


    Citation Envoyé par PIC16F877A Voir le message
    pour moi c'est oui
    Non. Un tableau n'est pas un pointeur. Ce qui porte la confusion, c'est qu'on se sert très souvent de pointeurs pour travailler sur des tableaux. Mais un tableau c'est un tableau et un pointeur c'est un pointeur.
    J'ai donné un premier exemple qui le démontrait. Mais en voici un second:
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    int main()
    {
        char tabX[5];
        char tabY[5];
     
        char* ptX;
        char* PtY;
     
        tabX=tabY;             // Ne compile pas
     
        ptX=ptY;             // Compile
    }

    Citation Envoyé par PIC16F877A Voir le message
    merci pour le confirmation a ce que j'ai déja dit, donc si le tableau est équivalent a l'adresse de son premier élément ,et ben le pointeur est aussi équivalent a une adresse pointe pour le premier élément
    Admettons que tu aies mal traduit en français ce qui est clair pour toi


    Citation Envoyé par PIC16F877A Voir le message
    tres certain et je te conseillé de tu te documenter bien avec des document qui t'aider pour approche de hardware cpu/ram/et aussi bien le langage assembleur parce que le langage C c'est fait juste pour simplifier les choses exemple pour quel qu'un comme toi puisse programmer crée des application pour étres un développeur trop vie , quoi je vais te donner un exemple de comment le langage C a simplifier une chose pour vous , par exemple au lieu de écrire un pointeur de pointeur il te laisse écrire un seul pointeur et lui s'occupe de l'autre pointeur lolll
    Là je ne pige plus rien. Les traducteurs automatiques c'est pas super efficace quand on arrive dans un domaine pointu en fait...

    Citation Envoyé par PIC16F877A Voir le message
    attention ne mélanger pas les chose moi j'ai dit que le 'nom' lui meme est une variable ce n'est pas la meme chose et merci encore une fois pour la confirmation tu a dit que ( pointeur n'est pas une variable mais une macrom ) donc c'est juste ce que je l'ai met dans mon l'exempble "#define pointer 0x956000"(toi et moi on le sais que impossible de definir une adresse de pointeur ) j'ai met ça juste pour lui comprendre que le pointeur ni qu'une équivalent de s'adresse et que le system qui la definera et pas moi avec le "#define pointer 0x956000" je vais maintenant réponde a ( pointeur n'est pas une variable) ok un poiteur est équivalent a une adresse et que ce n'est pas une variable, donc une adresse est une valeur exemple que cette valeur est de "0x956000" ou pense-tu qu'on va placer cette valeur dans ton poche ?, donc on place cette valeur dans une variale/la quelle?/ben celle que tu la déclaré comme nom de ton pointeur/tableau/variable
    Ouais désolé. Barrière de la langue et incompréhension mutuelle mais là je peux plus et c'est dommage...
    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]

  4. #24
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2010
    Messages : 87
    Points : 62
    Points
    62
    Par défaut
    Non. Un tableau n'est pas un pointeur. Ce qui porte la confusion, c'est qu'on se sert très souvent de pointeurs pour travailler sur des tableaux. Mais un tableau c'est un tableau et un pointeur c'est un pointeur.
    J'ai donné un premier exemple qui le démontrait. Mais en voici un second:

    int main()
    {
    char tabX[5];
    char tabY[5];

    char* ptX;
    char* PtY;

    tabX=tabY; // Ne compile pas

    ptX=ptY; // Compile
    }
    ici c'est toi qui a sauté les règles de ton langage C ça na rien avoir de comment crée des pointeur ou d'affecter des tableau en mémoire d'ordinateur ,chaque langue a ses fonctions et ses opérateurs d'affection,le C ne te parmi pas d'affecté un tableau que case pas case exemple le C nous parmi d'affecté une variable long long a une autre variable long long meme si le cpu a 32bit mais en assembleur le camion marchera pas donc mélange pas les choses et laisse ton langage a coté je vais te montre comment un pointeur en réalité est un pointeur de pointeur mais loin de ton langage et je commence par la déclaration de tableau parce que si le tableau devient un pointeur automatiquement le pointeur devient pointeur de pointeur imagine toi qu'on a une mémoire de 20 cases et qu'on veut crée un tableau[5] ça consommes pas seulement 5 variables mais il consomme 6 variable parce que une est réservé pour ID (l'adresse) de ton tableau et quand le system affecte ton tableau a la mémoire (je parle pas ici d'affectation des 5cases de tableau dans ton langage C) le system il sauvegarde la dresse de case1 dans la case0 et il te laisse l'adresse de la case0 0x00 pour l'utiliser comme ID de ton tableau et pour faire l'affectation dans ton langage C tu lui donne ID de ton tableau (0x00) car
    la machine ne traite pas les noms la machine récupère la donnée qu'il est dans
    l'adresse 0x00 = 0x01 pour pointe sur la premier case de ton tableau et c'est la meme chose pour le deuxieme tableau mais a l'adresse 0x06 et la c'est pas la machine qui connaitre l'adresse de ton deuxieme tableau mais c'est a l'aide de ton compilateur car a lui que tu as indiquer les 5cases de ton premier tableau et le compilateur calcule combien entre la case0 et case5 de ton premier tableau et traduire ça a la machine (0x06), la machine sauvegarde l'adresse de la case7 dans la case6 et il te laisse l'adresse de la case6 comme ID pour ton deuxiene tableau et pour le pointeur c'est la meme chose on affecte l'adresse de la case13 dans la case12 et en garde la dresse de la case12 comme ID de ton pointeur et pour faire une affectation de tablaeu a un pointeur il faut donner a la machine ID (0x12) de ton pointeur pour qu'elle puisse le localiser dans la mémoire et récupère sont contenu (0x13) adresse de ton premier case pointe de ton pointeur et puis ID de ton premier tableau (0x00) pour récupère (0x01) adresse de la premier case de ton tableau pour faire copier/coller de la donnée et si tu as bien remèrquer le codage c'est voila pour on mettre tableau[4] pour récupère la donnée de case5 donc pour ID de tableau tu le donne un nom comme macro/adresse/ID/montableau pour moi c'est une variable perdu de la mémoire c'est la meme choses avec les variables

  5. #25
    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
    @PIC16F877A

    Si je comprend bien ce que tu veux souligner :
    Pour accéder à une variable quel que soit son type, il faut que "ce qui permet cet accès" connaisse son adresse.

    C'est vrai qu'il faut bien que cette adresse soit codée quelque part ou au moins qu'il puisse la calculer.
    Mais, tu en déduis que les adresses sont obligatoirement rangées par "ce qui permet cet accès" quelque part dans une variable cachée (en quelque sorte) en mémoire. Il doit alors connaitre l'adresse de cette variable cachée (où est rangée l'adresse dont il a besoin) et, suivant ce principe, doit mettre l'adresse de cette variable cachée dans un autre variable cachée (pour avoir l'adresse de l'adresse de la variable). On n'en sortira pas.

    Même si on peut évoquer les mécanismes sous-jacent à l'exécution du code, on est ici dans un forum sur le langage C avec ses particularités et son vocabulaire. Le C a un degré d'abstraction supérieur au langage machine ou à l'assembleur et certains mécanismes sont cachés au programmeur parce qu'il n'a pas à les connaitre (sinon, autant programmer en langage machine ou en assembleur).

    le system il sauvegarde la dresse de case1 dans la case0 et il te laisse l'adresse de la case0 0x00 pour l'utiliser comme ID de ton tableau et pour faire l'affectation dans ton langage C tu lui donne ID de ton tableau (0x00).
    Peut-être fait-il comme ça pour repérer l'adresse d'un tableau, peut être fait-il autrement, l'important est que le programmeur C n'a pas besoin de le savoir et que le programme qu'il écrit est indépendant du mécanisme qu'utilise le compilateur.

    Au niveau d'abstraction du C, l'identificateur d'un tableau est l'adresse du début du tableau (sauf pour les opérateurs unaires sizeof et &) et n'identifie pas un hypothétique objet pointeur qui contiendrait cette adresse. Du point de vue du C, un tel objet pointeur n'existe tout simplement pas.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #26
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2010
    Messages : 87
    Points : 62
    Points
    62
    Par défaut
    Si je comprend bien ce que tu veux souligner :
    Pour accéder à une variable quel que soit son type, il faut que "ce qui permet cet accès" connaisse son adresse.
    juste 100% mais je ne suis pas d'accord seulement pour le mot "type" si vous vous voulez parlez de {char/int/long/longlong/et..} ça na rien avoir

    C'est vrai qu'il faut bien que cette adresse soit codée quelque part ou au moins qu'il puisse la calculer.
    Mais, tu en déduis que les adresses sont obligatoirement rangées par "ce qui permet cet accès" quelque part dans une variable cachée (en quelque sorte) en mémoire. Il doit alors connaitre l'adresse de cette variable cachée (où est rangée l'adresse dont il a besoin) et, suivant ce principe, doit mettre l'adresse de cette variable cachée dans un autre variable cachée (pour avoir l'adresse de l'adresse de la variable). On n'en sortira pas.
    oui biensur pour les adresses que ces sont obligatoirement rangées que ce soit le type de mémoire moi je parle de comment les copier et les traité comme donnée juste pour l'appelle de nos var/p/tab/ pas pour les déplacer,si me permis je ne suis pas d'accord avec vous aussi pour "(pour avoir l'adresse de l'adresse de la variable)" et pas parce que "(On n'en sortira pas.)" mais parce que c'est un passage obligatoire

    Même si on peut évoquer les mécanismes sous-jacent à l'exécution du code, on est ici dans un forum sur le langage C avec ses particularités et son vocabulaire. Le C a un degré d'abstraction supérieur au langage machine ou à l'assembleur et certains mécanismes sont cachés au programmeur parce qu'il n'a pas à les connaitre (sinon, autant programmer en langage machine ou en assembleur).
    c'est vrais le l'assembleur c'est été mon passage

    Peut-être fait-il comme ça pour repérer l'adresse d'un tableau, peut être fait-il autrement, l'important est que le programmeur C n'a pas besoin de le savoir et que le programme qu'il écrit est indépendant du mécanisme qu'utilise le compilateur.
    100% d'accord avec vous mais celui qui ma piqué et dire que je suis faut donc j'été obliger de défende a ma connaissance c'est pour ça que j'ai pircer sont l'angage C

  7. #27
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Points : 42
    Points
    42
    Par défaut
    Waouh, je ne m'attendais pas à ce que la discussion tourne comme cela xD. Mais j'avoue qu'on a eu beaucoup d'élèments intéressants. Si j'ai bien compris d'après PIC16F877A, si on s'enfonce plus dans le fonctionnement de la machine le tableau est un pointeur. Mais qu'en C, on ne s'occupe de connaître les mécanismes derrières, et que donc un tableau est un tableau, non un pointeur.

  8. #28
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    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 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par Flynet Voir le message
    Waouh, je ne m'attendais pas à ce que la discussion tourne comme cela xD. Mais j'avoue qu'on a eu beaucoup d'élèments intéressants. Si j'ai bien compris d'après PIC16F877A, si on s'enfonce plus dans le fonctionnement de la machine le tableau est un pointeur. Mais qu'en C, on ne s'occupe de connaître les mécanismes derrières, et que donc un tableau est un tableau, non un pointeur.
    Ce n'est même pas vrai.

    Un tableau n'est pas associé à un pointeur explicite. C'est le compilateur qui sait où il se trouve et qui le dit quand on lui demande, et c'est ce même compilateur qui organise sa mémoire comme ça lui chante. La machine n'est au courant de rien en particulier (c'est d'ailleurs pour cela qu'on déclenche parfois des segfaults). Pour être exact :

    — Un tableau est une suite consécutive ordonnée de variables du même type en mémoire. Donc, à partir du moment où l'on connaît l'emplacement de l'une d'entre elles, on peut en déduire celui des autres ;
    — Un pointeur est une variable qui contient une adresse mémoire, celle d'un élément connu ou pas (cas de void *). Ça veut dire d'une part que ce pointeur a lui même sa propre adresse, qui n'a rien à voir avec celle qu'il transporte et que ce qu'il pointe éventuellement est complètement indépendant.

    Maintenant, ceci posé :

    À partir du moment où on connaît le type et la taille de ce qui est pointé par le pointeur, on peut non seulement aller le chercher (avec « * »), mais aussi aller chercher les suivants puisque, de la même façon que pour un tableau, on peut déduire la position des éléments suivants.

    Dans le même esprit, lorsque l'on invoque le nom du tableau seul, le compilo nous renvoie son emplacement en mémoire, là où il commence, en tout cas, ce qui correspond à l'adresse de son premier élément. Donc l'expression est de type « type * » et, de là, peut être exploitée comme un pointeur. Mais ce n'est pas pour autant que c'est la même chose.

    Le meilleur moyen de s'en convaincre est de visionner les adresses et les contenus respectifs des deux cas de figure :

    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
    #include <stdio.h>
     
    int main (void)
    {
        char   tab [25];
        char * ptr = tab;
     
        printf ("ptr  = %p\n",ptr);
        printf ("&ptr = %p\n",&ptr);
     
        puts ("");
        printf ("tab  = %p\n",tab);
        printf ("&tab = %p\n",&tab);
     
        puts ("");
        printf ("sizeof ptr = %ld\n",sizeof ptr);
        printf ("sizeof tab = %ld\n",sizeof tab);
     
        return 0;
    }
    Code Shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ ./tp
    ptr  = 0xffdb71d7
    &ptr = 0xffdb71d0
    
    tab  = 0xffdb71d7
    &tab = 0xffdb71d7
    
    sizeof ptr = 4
    sizeof tab = 25

    On voit bien que dans le premier cas, le contenu du pointeur et son adresse propre sont deux choses différentes. Dans le cas du tableau, demander explicitement son adresse avec « & » ou invoquer le tableau lui-même en donnant simplement son nom revient au même.

    On voit également que le tableau occupe exactement la taille déclarée en mémoire, ni plus ni moins (parce qu'il n'y a pas de méta-données additionnelles) et que le pointeur, lui, a toujours le format d'une adresse en mémoire (4 octets sur une machines 32 bits).

    GCC compile ce programme sans se plaindre. Mais si on active les warnings avec -Wall, le compilateur prévient qu'il ne s'agit pas de la même chose.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. problème avec malloc
    Par cyril_sy dans le forum C
    Réponses: 13
    Dernier message: 12/05/2007, 13h49
  2. Problème avec malloc et autre
    Par ego dans le forum C
    Réponses: 5
    Dernier message: 02/05/2007, 18h29
  3. probléme avec malloc
    Par tomasi dans le forum C
    Réponses: 18
    Dernier message: 15/11/2006, 15h15
  4. Problème avec malloc
    Par f56bre dans le forum C
    Réponses: 11
    Dernier message: 13/11/2006, 14h36
  5. Problème avec malloc.
    Par kmitz dans le forum C
    Réponses: 2
    Dernier message: 25/03/2006, 18h05

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