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

Réseau C Discussion :

Problème de tableau dans une structure


Sujet :

Réseau C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Points : 55
    Points
    55
    Par défaut Problème de tableau dans une structure
    Salut !

    J'ai un problème avec un tableau dans ma structure !
    En fait le problème vient de moi, puisque je suis encore un peu perdu avec les pointeurs et tout ça...

    Voici donc ce que j'ai :
    Dans mon fichier .h, j'ai une structure nommée info contenant un char **tableau;
    Ce tableau est un tableau de char, donc un tableau à deux dimensions.

    Dans le main de mon fichier .c, je veux à un moment donné utiliser ce tableau.
    J'alloue donc la 1e dimension du tableau pour qu'il accepte nb éléments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma_struct->tableau = malloc( sizeof(*(ma_struct->tableau)) * nb);
    (déjà là j'ai un gros doute sur cette instruction)

    Plus loin, je veux insérer un texte dans une case du tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(ma_struct->tableau[i], texte);
    Évidemment ça plante à cet endroit, et je ne sais pas si c'est parce que le malloc d'avant était mauvais, ou si c'est cette dernière instruction qui plante...

    Je précise aussi que je ne connais pas à priori la taille des textes à insérer dans le tableau, donc je dois allouer la mémoire de chaque dimensions séparément.


    De plus (j'anticipe les problèmes à suivre mais c'est dans le même registre), pour libérer la mémoire, est-ce qu'il me suffit de faire un free sur le tableau ou bien je dois faire un free pour chaque dimension ?
    Et la syntaxe suivante est-elle correcte ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    free(ma_struct->tableau[i]);
    free(ma_struct->tableau);

    Merci d'avance !!

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Bonjour,
    Une ambiguité dans ce que tu dis
    Dans mon fichier .h, j'ai une structure nommée info contenant un char **tableau;
    Ce tableau est un tableau de char, donc un tableau à deux dimensions.
    le type char** n'est pas approprié pour un tableau de char quelque soit sa dimension mais pour un tableau de char*. Chaque char* pouvant alors être un pointeur sur un tableau de char. Si tu as adopté cette solution, tu dois allouer le tableau de char* (en quantité nécessaire pour pointer toutes tes chaînes) et pour chaque char* de ce tableau, allouer la quantité de char nécessaire pour chaque chaîne. Il y a donc deux étapes dans l'allocation et il semble que tu as oublié la seconde
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(ma_struct->tableau[i], texte);
    ma_struct->tableau[i] n'a pas, sans doute été initialisé par l'adresse d'un tableau de char
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ma_struct->tableau[i] = malloc(strlen(texte)+1);
    //tester le retour du malloc
    strcpy(ma_struct->tableau[i], texte);
    Pour la libération, c'est simple : tu dois avoir autant de free que de malloc. Tout ce qui a été obtenu par malloc doit être libéré par free.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Points : 55
    Points
    55
    Par défaut
    effectivement ma formulation était ambiguë...
    J'ai ajouté le malloc dans mon code, et ça me pose un autre problème, que je ne comprend alors pas du tout !

    En fait, mon appli est en deux fichiers, le premier envoie en UDP (donc avec la librairie des sockets) un message au second, le second fichier correspond à ce dont j'ai parlé avant, c'est-à-dire que c'est là qu'il y a la structure et le tableau à deux dimensions.

    Or depuis que j'ai ajouté le malloc, les messages que je reçois (même avant toute utilisation du tableau !) sont modifiés :
    Par exemple le premier envoi que je fais est CNX\0, et je reçois sur stdin CNXwàè" (alors que c'est CNX qui devrait s'afficher)


    C'est très bizarre car j'ai juste ajouté ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ma_struct->tableau[i] = malloc(strlen(texte)+1);
    et c'est cette ligne qui semble générer le problème, alors qu'elle n'est jamais atteinte !!

    Peut-être que je m'y suis mal pris avec mes sockets, mais je ne pense pas. Je ne vois vraiment pas le lien entre cette instruction et la réception de message (qui se fait en aval)... Est-ce un effet de bord ?

  4. #4
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Je ne vois vraiment pas le lien entre cette instruction et la réception de message (qui se fait en aval)... Est-ce un effet de bord ?
    Probablement, il y avait déjà un problème de réception des messages qui n'était pas (par malchance) mis en évidence. Je crois qu'il faut chercher de ce coté là.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Points : 55
    Points
    55
    Par défaut
    Bon j'ai (lâchement) résolu mon problème en me passant de tableau et en utilisant une liste chainée... Ça fait plus de code mais au moins ça fonctionne !!!
    Vivement qu'il y ait des langages aussi puissants que le C mais plus faciles à utiliser !!


    En tout cas merci pour ton aide !!

  6. #6
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    zarbiman :
    Bon j'ai (lâchement) résolu mon problème ...
    J'espère pour toi que c'est le cas. Toutefois, à ta place, je ne serai pas très rassuré car le problème n'ayant pas été identifié, il est peut être à nouveau caché jusqu'à ce que ....

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

Discussions similaires

  1. Utilisation d'un tableau dans une structure
    Par Angelique64 dans le forum VB.NET
    Réponses: 2
    Dernier message: 27/06/2009, 11h05
  2. Problème de sauvegarde dans une structure
    Par Invité dans le forum Windows Forms
    Réponses: 8
    Dernier message: 18/05/2008, 11h24
  3. allocation d'un tableau dans une structure
    Par Klaine dans le forum Débuter
    Réponses: 3
    Dernier message: 02/04/2008, 23h51
  4. Réponses: 6
    Dernier message: 12/09/2007, 15h58
  5. Tableau dans une structure
    Par Elstak dans le forum C
    Réponses: 3
    Dernier message: 25/04/2007, 11h45

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