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 :

Question sur les tableaux


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 23
    Points
    23
    Par défaut Question sur les tableaux
    Bonjour,

    J'ai essayé de déclarer un tableau de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int main() {
    int n = 1000000;
    int i;
    char tab[n];
    char str[] = "Taille du tableau: ";
     
    for(i=0;i<n;i++) {
    tab[i]=i%255;
    }
     
    printf("%s%d\n", str, sizeof(tab));
     
    }
    à ma surprise la compilation n'a posée aucun problème avec gcc, fonctionne parfaitement et affiche :
    Taille du tableau: 1000000

    Et pourtant sous GDB un sizeof(tab) donne 2 ...

    S'agit t-il d'une particularité de gcc ou d'une nouvelle norme du C ?
    Et comment expliquer cette valeur 2 renvoyée par GDB ?

  2. #2
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 23
    Points
    23
    Par défaut
    Je viens de trouver la réponse tout seul c'est la norme C99 qui a introduit cette pratique

    Par contre cela n'explique toujours pas la valeur 2 renvoyée par GDB ...

  3. #3
    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 Fendal
    Je viens de trouver la réponse tout seul c'est la norme C99 qui a introduit cette pratique

    Par contre cela n'explique toujours pas la valeur 2 renvoyée par GDB ...
    Probablement que gdb ne connait pas C99...

    Je signale que les VLA (Variable Length Array) sont 'broken' sous gcc...

    http://www.gnu.org/software/gcc/gcc-4.2/c99status.html

    De plus, je déconseille cette pratique, car en cas d'erreur, on est pas prévenu (1000000 bytes sur la pile, c'est du sévère !). Je recommande malloc()/free().

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Sans doute GDB considere qu'il a affaire à un pointeur quoique 2 ca ne fait peut-être pas bcp pour un pointeur...

    C'est sur quelle plateforme ?

  5. #5
    Membre régulier Avatar de Beldom
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 63
    Points : 70
    Points
    70
    Par défaut
    De mémoire, la taille d'un pointeur est de 4.
    Pas 2. Donc il ne devrait pas renvoyer 2...

    Je pense également que cela viens d'un problème dû à la norme C99 que gdb ne doit pas "connaitre" plus qu'a la taille véritable du tableau.

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Citation Envoyé par Beldom
    De mémoire, la taille d'un pointeur est de 4.
    Pas 2. Donc il ne devrait pas renvoyer 2...
    Non, ça depend de la plateforme...

    Ceci dit, oui sur les plateformes les plus répandues c'est effectivement 4... mais c'est déjà ce que je disait dans mon mail...

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 22
    Points : 23
    Points
    23
    Par défaut
    La taille de 1 Million était volontaire pour violenter un peu le compilateur et le programme.

    Pour la taille de 2 j'avais effectivement pensé à une taille de pointeur au début, mais cette taille est de 4 sur cette plateforme donc j'avais rapidement écarté cette solution.

    Pour info sur ma plateforme :
    sizeof(void*) = 4
    sizeof(int) = 4
    sizeof(char) = 1

    Par contre, je note que les VLA sont broken sous GCC, c'est toujours bon à savoir ça !

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    sizeof(char)=1 c'est la norme...

Discussions similaires

  1. question sur les tableaux
    Par scolopendra dans le forum Langage
    Réponses: 4
    Dernier message: 12/06/2007, 15h15
  2. Question sur les tableaux
    Par Chii-san dans le forum VB.NET
    Réponses: 2
    Dernier message: 05/03/2007, 11h48
  3. Réponses: 9
    Dernier message: 13/06/2006, 21h52
  4. [Tableaux] Question sur les tableaux
    Par Shandler dans le forum Langage
    Réponses: 16
    Dernier message: 21/04/2006, 00h15
  5. question sur les tableaux
    Par Neko dans le forum C++
    Réponses: 13
    Dernier message: 14/02/2006, 02h21

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