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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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
    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 : 36
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    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....
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    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 !
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 814
    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 814
    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...
    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]

  6. #6
    Membre confirmé
    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
    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