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 :

Tableau dynamique de pointeurs sur const char*


Sujet :

C

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut Tableau dynamique de pointeurs sur const char*
    Bonjour,

    J'ai une question qui a du déjà être posée mais je ne l'ai pas trouvée dans le forum, alors je vous demande :

    Pour info, mon code fait intervenir un peu de C++, car j'utilise les deux dans cette partie de mon programme.

    J'ai donc un tableau de string en C++, et je voudrais créer à partir de celui ci un tableau de char* en C (le meme, mais des char* à la place des string)

    j'utilise pour celà la méthode c_str() de la classe string afin d'obtenir le char* correspondant, mais cette méthode renvoie un const char*, que je n'arrive pas à insérer dans un char** (en C). Ma question est : comment déclarer le pointeur en C pour que le compilateur accepte qu'il soit rempli par des const char* ?

    Et plus précisément (meme si le fait que ce soit constant n'est pas primordial pour moi) : comment faire pour déclarer un tableau (dynamique) de pointeurs sur constantes, et ensuite pouvoir remplir ce tableau ?

    je crois que j'ai réussi en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* const * tab = malloc(...);
    mais à la compilation, il refuse le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab[i] = string.c_str();
    motif : impossible d'écrite dans une zone en lecture seule.

    Voila, je ne sais pas si j'ai été très clair, mais tout ça me pose un problème
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  2. #2
    Membre averti Avatar de yetimothee
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 260
    Points : 364
    Points
    364
    Par défaut
    Je vais peut-être dire une bétise :
    le fait que ton tableu soit constant ne gènerais pas ?

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par yetimothee Voir le message
    Je vais peut-être dire une bétise :
    le fait que ton tableu soit constant ne gènerais pas ?
    Si surement, mais comment le remplir ? Je ne peux pas le remplir à la définition : c'est un malloc...

    C'est pour ça que je coince , mais merci d'avoir répondu rapidement
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Le Mérovingien Voir le message
    Si surement, mais comment le remplir ? Je ne peux pas le remplir à la définition : c'est un malloc...

    C'est pour ça que je coince , mais merci d'avoir répondu rapidement
    D'une manière générale, si tu souhaite modifier une variable (quelque soit son type), il ne faut pas qu'elle soit const. C'est justement le rôle du const de limiter l'accès à une variable en lecture seule.

    Sinon concernant plus précisément ton problème, ce n'est pas le pointeur qui est constant, mais la mémoire présente à l'adresse correspondante. Ce n'est donc pas
    mais

    ou


  5. #5
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab[i] = string.c_str();
    Ceci est dangereux : C'est une simple copie du pointeur retourné par string.c_str() qui peut cesser d'être valide selon les opérations effectuées ensuite sur le string. Une recopie du contenu du string serait plus sûre (à moins que tu sois certain de ton affaire)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  6. #6
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Citation Envoyé par diogene Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab[i] = string.c_str();
    Ceci est dangereux : C'est une simple copie du pointeur retourné par string.c_str() qui peut cesser d'être valide selon les opérations effectuées ensuite sur le string. Une recopie du contenu du string serait plus sûre (à moins que tu sois certain de ton affaire)

    diogene a entièrement raison. Rien de garanti dans le temps l'accès au pointeur retourné par c_str().

    c_str() garanti seulement à un instant donné un accès en lecture seule à la valeur du contenu de l'objet string.

    De plus, il peut s'agir d'une copie temporaire du buffer réel car rien n'est imposé pour la gestion interne du buffer.

    Morale de l'histoire, si tu veux stocker, il faut alors copier !
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    Merci pour ces deux nouvelles réponses, je pense qu'elles m'apportent enfin la solution à l'éternelle question : pourquoi ça marche pas ? Je ne pensais pas que mon code pouvait modifier (ou du moins supprimer/libérer, je ne sais pas) le contenu du pointeur renvoyé par c_str(), mais ça doit être le cas. J'ai donc copié les chaines dans un autre tableau et tout fonctionne.

    Merci pour vos réponses,

    @ bientôt !
    Avec les ordinateurs, 99% des bugs proviennent de l'interface chaise-clavier...

    Comment ça 1Km n'est pas égal à 1024m ???

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/03/2015, 12h12
  2. Double tableau dynamique de pointeurs de struct
    Par dedibox26 dans le forum Débuter
    Réponses: 2
    Dernier message: 27/04/2010, 16h24
  3. adresse de pointeur sur unsigned char
    Par info21 dans le forum C
    Réponses: 2
    Dernier message: 15/04/2010, 19h00
  4. Problème de *pointeur sur des char
    Par Spartan03 dans le forum C++
    Réponses: 2
    Dernier message: 18/09/2005, 15h20

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