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 :

Initialisation d'un tableau de 2 dimensions


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 13
    Par défaut Initialisation d'un tableau de 2 dimensions
    Bonjour a tous ,

    j'ai rencontré un probléme lors de l'initialisation d'un tableau de 2 dimensions , mon code je le compile sous linux avec le compilateur GCC .

    je poste ci-dessous les deux programme le premier marche é le deuxiéme non .

    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
     #include <stdio.h>
    #include <string.h>
    #include <stdint.h>
    #include <stdio.h>
     
    #define NB_LIGNES 2048
    #define NB_COLS   2048
     
    int main(void)
    {
      char* cases[2048][30]; 
         cases[0][0]="alalal";
         cases[1][0]="edfee";
         cases[2][0]="edfee";
     
       printf("%s\n",cases[0][0]);
       printf("%s\n",cases[1][0]);
       printf("%s\n",cases[2][0]);
     
      return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Affichage :
     alalal
    edfee
    edfee
    Programmme 2 avec utilisation de strcpy ne marche pas !!!!!

    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
     
    #include <stdio.h>
    #include <string.h>
    #include <stdint.h>
    #include <stdio.h>
     
    #define NB_LIGNES 2048
    #define NB_COLS   2048
     
    int main(void)
    {
      char* cases[2048][30]; 
     
     
     
         cases[0][0]="alalal";
         cases[1][0]="edfee";
         cases[2][0]="edfee";
     
        strcpy(cases[0][0],"alalal");
        strcpy(cases[1][0],"blblbl");
         strcpy(cases[2][0],"dlsmsm");
     
     
      return 0;
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Affichage sortie :
    Segmentation fault (core dumped)


    Merci d'avance

  2. #2
    Membre Expert
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Par défaut
    Bonjour,

    Ce comportement est tout à fait normal, étant donné que tes chaînes de caractères sont dans une section uniquement accessible en lecture seule (.rodata généralement).

    Ainsi toute tentative d'écriture dans cette zone mémoire (ce que tu fais avec un strcpy) échouera lamentablement (sans parler du fait que tu recopies des chaînes plus grandes que la taille du buffer, ce qui irait joyeusement écraser les données derrière si la zone mémoire était accessible en écriture).

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 13
    Par défaut
    Merci pour vos réponses ,

    @ ram-0000 c'est pas un probleme de '&' avant les strcpy , maintenant avec la '&' le programme ne se compile même pas : voici l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    main.c:11:6: warning: passing argument 1 of ‘strcpy’ from incompatible pointer type [enabled by default]
    In file included from main.c:2:0:
    /usr/include/string.h:128:14: note: expected ‘char * __restrict__’ but argument is of type ‘char **’
    main.c:12:6: warning: passing argument 1 of ‘strcpy’ from incompatible pointer type [enabled by default]
    In file included from main.c:2:0:
    /usr/include/string.h:128:14: note: expected ‘char * __restrict__’ but argument is of type ‘char **’
    main.c:13:6: warning: passing argument 1 of ‘strcpy’ from incompatible pointer type [enabled by default]
    In file included from main.c:2:0:
    /usr/include/string.h:128:14: note: expected ‘char * __restrict__’ but argument is of type ‘char **’

    le programme :
    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>
    #include <string.h>
     
     
    int main(void)
    {
      char* cases[2048][30]; 
     
         strcpy(&cases[0][0],"alalal");
         strcpy(&cases[1][0],"blblbl");
         strcpy(&cases[2][0],"dlsmsm");
     
     
       printf("%s\n",cases[0][0]);
       printf("%s\n",cases[1][0]);
       printf("%s\n",cases[2][0]);
     
     
      return 0;
    }

  4. #4
    Membre Expert
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Par défaut
    @ram-000: la variable cases est un tableau à 2 dimensions de char* donc ça vient pas de là.

    Et pour info, j'ai regardé avec gdb ce qui se passait:

    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
    Program received signal SIGSEGV, Segmentation fault.
    --------------------------------------------------------------------------[ regs]
      EAX: 0x080484D0  EBX: 0xB7FAE000  ECX: 0x89AB2199  EDX: 0xBFFFF3D4  o d I t S z a p c 
      ESI: 0x00000000  EDI: 0x00000000  EBP: 0xBFFFF3A8  ESP: 0xBFFC33A8  EIP: 0x080483FD
      CS: 0073  DS: 007B  ES: 007B  FS: 0000  GS: 0033  SS: 007B
    --------------------------------------------------------------------------[ code]
    => 0x80483fd <main+45>:	mov    DWORD PTR [eax],0x6c616c61
       0x8048403 <main+51>:	mov    WORD PTR [eax+0x4],0x6c61
       0x8048409 <main+57>:	mov    BYTE PTR [eax+0x6],0x0
       0x804840d <main+61>:	mov    eax,DWORD PTR [ebp-0x3bf88]
       0x8048413 <main+67>:	mov    DWORD PTR [eax],0x6c626c62
       0x8048419 <main+73>:	mov    WORD PTR [eax+0x4],0x6c62
       0x804841f <main+79>:	mov    BYTE PTR [eax+0x6],0x0
       0x8048423 <main+83>:	mov    eax,DWORD PTR [ebp-0x3bf10]
    --------------------------------------------------------------------------------
    0x080483fd in main ()
    gdb$ x/s $eax
    0x80484d0:	"alalal"
    Donc c'est bien un problème de "read only" qui intervient ici (et on peut là-aussi inspecter le "program header" du programme)

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    OK, ma faute

    J'avais pas vu que c'était un tableau de "char *", je n'avais vu que le char.

    La syntaxe strcpy telle que tu l'avais écrite est donc bonne

    Par contre, il faut allouer de la mémoire pour chaque case du tableau avant de faire la copie par strcpy
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    effectivement, ceci n'est pas correct et conduit à une tentative d'écriture en mémoire RO :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cases[0][0]="alalal";
    strcpy(cases[0][0],"alalal");
    La première instruction stocke dans cases[0][0] un pointeur sur une chaine de caractère read only

    La deuxième instruction copie une chaine de caractères dans le pointeur contenu par cases[0][0] (donc un pointeur sur une zone read only)

    Si tu fais comme cela : le meiux serait de déclarer le tableau comme un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const char *cases[2048][30]
    , comme ceci, toute tentative de strcpy sera détectée par le compilateur.

    Si tu veux absoluiment faire par strcpy, il faut faire un malloc avant le strcpy et ne pas oublier le free à la fin.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

Discussions similaires

  1. Initialisation d'un tableau de 2 dimensions de structures
    Par zzoumzzoum dans le forum Débuter
    Réponses: 3
    Dernier message: 27/05/2010, 12h58
  2. Comment initialiser dynamiquement un tableau 2 dimensions
    Par ttttnht dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 14/08/2009, 10h41
  3. initialiser a tableau de deux dimension
    Par can48yous dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 20/06/2008, 10h44
  4. Initialisation d'un tableau à plusieurs dimensions
    Par kinouseb dans le forum Windows Forms
    Réponses: 2
    Dernier message: 07/02/2007, 13h16
  5. Réponses: 7
    Dernier message: 30/01/2007, 09h48

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