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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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 : 38
    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
    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

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 260
    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 confirmé
    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 : 38
    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
    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

  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 : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    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 confirmé
    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
    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)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    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

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

Discussions similaires

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

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