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 :

b-a-ba sur initialisation **tab


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 65
    Par défaut b-a-ba sur initialisation **tab
    Hello,

    Je suis tout juste débutant et mon pitoyable code doit être bourré d'erreurs. pardon d'avance.

    Mais voila, après plusieurs tatonnements ce code semble fonctionner à première vue et pourtant quand je décommente la boucle, ça plante sur une "segmentation fault".

    Quelqu'un pourrait-il m'aider à comprendre le problème et m'indiquer d'autres erreurs éventuelles. Vive le C, mais qu'est-ce que c'est difficile

    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
     
     
    	int i, j;
    	char **tabchaine;
     
    	tabchaine = (char**) malloc(10 * sizeof(char*));
     
    	for (i = 0; i < 5; i++)
    		tabchaine[i] = (char*) malloc(7 * sizeof(char));
     
    //	for (i = 0; i < 10; i++)
    //		strcpy(tabchaine[i], "aaaaaa");
     
    	strcpy(tabchaine[1], "zzzzz");
     
    	for (i = 0; i < 10; i++)
    		printf ("tabchaine[%d] : %s\n", i, tabchaine[i]);
    Ce n'est pas du tout comme ça qu'on fait ?

  2. #2
    zul
    zul est déconnecté
    Membre chevronné Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Par défaut
    C'est pas mal, mais tu as du changer la taille de ton tableau à un moment. Tu initialise seulement ton tableau de 0 à 5, et ensuite tu parcours de 0 à 10 (et tu alloue un tableau de 10 éléments donc ça parait cohérent).

    Je te conseille d'utiliser un const size_t pour définir la taille de ton tableau une seule fois, et d'utiliser cette variable dans toutes tes boucles, ça évitera ce genre d'erreur.

  3. #3
    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
    Aller, c'est presque bon, l'erreur est ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	for (i = 0; i < 5; i++)
    		tabchaine[i] = (char*) malloc(7 * sizeof(char));
     
    	for (i = 0; i < 10; i++)
    		strcpy(tabchaine[i], "aaaaaa");
    Tu alloues 5 chaines de 7 caractères dans ton tableau et tu en écrit 10

    Il faudrait utiliser les constantes pour supprimer ce genre d'erreur

    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
     
    #define SIZE_ARRAY 10
    #define LEN_STRING 7
     
    	int i, j;
    	char **tabchaine;
     
    	tabchaine = (char**) malloc(SIZE_ARRAY * sizeof(char*));
     
    	for (i = 0; i < SIZE_ARRAY; i++)
    		tabchaine[i] = (char*) malloc(LEN_STRING * sizeof(char));
     
    	for (i = 0; i < SIZE_ARRAY; i++)
    		strcpy(tabchaine[i], "aaaaaa");
     
    	strcpy(tabchaine[1], "zzzzz");
     
    	for (i = 0; i < SIZE_ARRAY; i++)
    		printf ("tabchaine[%d] : %s\n", i, tabchaine[i]);
    Attention tu n'alloure que 7 octets pour ta chaine de caractères (donc 6 caractères + \0).

    Lorsque tu fais le strcpy(tabchaine[i], "aaaaaa"), tu es dangereusement proche de la limite.

    [Edit] Grilled mais dans la même minute
    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
    .

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 65
    Par défaut
    Merci !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 65
    Par défaut
    Euh pour confirmation, pas de problème avec les casts, ni mes sizeof ?
    Mon compilateur sous Kdevelop me parait très permissif sur ces questions.

    Et je ne suis pas sûr d'avoir encore bien compris la logique.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2009
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 65
    Par défaut
    Autres questions de base et j'en aurai fini pour le moment:

    1/ Ai-je le droit de réallouer un seul emplacement de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	realloc(tabchaine[4], 16 * sizeof(char));
    	strcpy(tabchaine[4], "123451234512345");
    ...
    	for (i = 0; i < 10; i++)
    		printf ("tabchaine[%d] : %s\n", i, tabchaine[i]);
    Ce qui semble parfaitement fonctionner mais j'ai comme un doute.

    2/ Ce code fonctionnerait-il si j'avais utilisé calloc au lieu de malloc pour l'initialisation ?
    Là aussi, il semble que oui mais j'ai qd même un gros doute.

  7. #7
    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
    Citation Envoyé par vitoubien Voir le message
    Autres questions de base et j'en aurai fini pour le moment:

    1/ Ai-je le droit de réallouer un seul emplacement de cette façon:

    realloc(tabchaine[4], 16 * sizeof(char));
    strcpy(tabchaine[4], "123451234512345");
    ...
    for (i = 0; i < 10; i++)
    printf ("tabchaine[%d] : %s\n", i, tabchaine[i]);

    Ce qui semble parfaitement fonctionner mais j'ai comme un doute.
    Oui, c'est tout bon

    realloc essaye d'agrandir le bloc mémoire précédemment alloué par malloc ou realloc. S'il n'y a pas assez de place pour agrandir, il alloue un nouveau bloc, copie l'ancien bloc dans le nouveau bloc et libère l'ancien bloc.

    Citation Envoyé par vitoubien Voir le message
    2/ Ce code fonctionnerait-il si j'avais utilisé calloc au lieu de malloc pour l'initialisation ?
    Là aussi, il semble que oui mais j'ai qd même un gros doute.
    Je ne sais pas, je n'utilise jamais calloc (mais c'est une habitude personnelle)
    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
    .

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/08/2006, 13h17
  2. cherche tuto sur les tab control
    Par firejocker dans le forum MFC
    Réponses: 66
    Dernier message: 14/12/2005, 16h55
  3. questions sur les tabs a plusieurs dimensions
    Par rosviper45 dans le forum C
    Réponses: 16
    Dernier message: 27/11/2005, 14h20
  4. Réponses: 6
    Dernier message: 20/10/2005, 22h33
  5. Erreur à l'assignation du PageControl sur une tab
    Par MarcP dans le forum Composants VCL
    Réponses: 1
    Dernier message: 08/08/2005, 22h49

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