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 :

Représentation mémoire tableau 2 dimensions


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Points : 87
    Points
    87
    Par défaut Représentation mémoire tableau 2 dimensions
    Bonjour à tous,

    suite à quelques observations je suis quelque peu dérouté...

    Voici le test effectué:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char tab[8][8];
    tab[3][7]='A';
    tab[4][0]='B';
    printf("tab[3][7] = %c \nSon adresse = %p\n", tab[3][7], &tab[3][7]); // Adresse en %p = ffbffa87 | en %d = -4195705
     
    printf("tab[4][0] = %c \nSon adresse = %p\n", tab[4][0], &tab[4][0]); // Adresse = en %p = ffbffa88 | en %d = -4195704
    Si l'on regarde les adresses de plus près:
    le résultat en héxa indique 4 bits de différence entre les 2 adresses alors qu'il y a un char à chacune des adresses (qui s'affichent correctement).

    Plus étonnant encore, l'adresse renvoyée en %d indique un seul bit de différence.

    Est-ce possible ?

    Merci de m'avoir lu.

  2. #2
    Membre expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Points : 3 352
    Points
    3 352
    Par défaut
    Bonjour,

    Une précision sur le vocabulaire, il ne s'agit pas de bit mais de byte (=octet).
    Quand tu déclares un tableau comme char tab[8][8] il y aura 8 fois 8 = 64 char de réservés et ces char seront contigus. Donc oui c'est normal que tab[3][7] soit juste 'avant' tab[4][0].
    C'est comme si tu avais un char tab[8*8] et que tab[ligne][colonne] te renvoie la valeur tab[ligne*8+colonne].

  3. #3
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 528
    Points
    3 528
    Par défaut
    Et il me semble : une adresse contient un mot... donc pas nécessairement 1 octet...
    Après, je n'ai jamais vraiment testé ni regardé en pratique comment le C alloue des char[][]

    EDIT : oui bah pour le coup c'est logique...
    32bits = 4o
    64bits = 8o

    Donc entre [x][7] et [x + 1][0], on arrive au "bout" de ce que contient l'adresse... donc +1 dessus....

  4. #4
    Membre éclairé
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Points : 807
    Points
    807
    Par défaut
    Bonsoir,

    Citation Envoyé par stoner Voir le message
    le résultat en héxa indique 4 bits de différence entre les 2 adresses alors qu'il y a un char à chacune des adresses (qui s'affichent correctement).
    Où est-ce que tu vois 4 bits de différence ? 0xffbffa88 - 0xffbffa87 = 0x1, hein ? Le compilateur ne peut pas ajouter de bits de padding entre les éléments d'un tableau, donc les adresses sont, en toute logique, contiguës.

    Citation Envoyé par stoner Voir le message
    Plus étonnant encore, l'adresse renvoyée en %d indique un seul bit de différence.
    De toute manière, tu n'as aucune garantie que ton pointeur aura une représentation identique à celle d'un entier (ce n'est d'ailleurs pas le cas sur un grand nombre d'architectures). En théorie, tu ne devrais donc pas te reposer sur ces résultats... Bien qu'ils soient paradoxalement « logiques », ici. Par ailleurs, on notera que, pour être parfaitement standard, il faudrait transtyper l'argument du format %pen void *, car printf est une fonction à nombre variable d'arguments.

    Bonne soirée !

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Salut
    Citation Envoyé par stoner Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("tab[3][7] = %c \nSon adresse = %p\n", tab[3][7], &tab[3][7]); // Adresse en %p = ffbffa87 | en %d = -4195705
    printf("tab[4][0] = %c \nSon adresse = %p\n", tab[4][0], &tab[4][0]); // Adresse = en %p = ffbffa88 | en %d = -4195704
    Moi j'aime bien ceux qui mettent des valeurs négatives pour des adresses. Tu habites où ? Moi j'habite au -128 de la rue Truc !!!

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    printf("tab[3][7] = %c \nSon adresse = %p\n", tab[3][7], &tab[3][7]); // Adresse en %p = ffbffa87 | en %u = 4 290 771 591
    printf("tab[4][0] = %c \nSon adresse = %p\n", tab[4][0], &tab[4][0]); // Adresse = en %p = ffbffa88 | en %u = 4 290 771 592

    Sinon pour le reste tout le monde t'a déjà répondu. Les deux adresses de tes deux cases contiguës sont exactement à une unité l'une de l'autre ce qui est demandé par la norme...

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 83
    Points : 87
    Points
    87
    Par défaut
    D'accord merci à vous je le retiendrai!

    Je ne sais vraiment pas comment j'ai fait mon compte...

    Soit, c'est résolu merci bien.

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

Discussions similaires

  1. allocation mémoire tableau 2 dimensions
    Par imou222 dans le forum Débuter
    Réponses: 3
    Dernier message: 22/04/2014, 17h35
  2. Réponses: 17
    Dernier message: 10/04/2013, 18h46
  3. Réponses: 1
    Dernier message: 06/04/2007, 11h38
  4. Passage d'un tableau à deux dimensions
    Par karl3i dans le forum C
    Réponses: 3
    Dernier message: 20/10/2003, 14h50
  5. Réponses: 23
    Dernier message: 21/08/2003, 07h16

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