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 :

Segmentation fault avec strcpy()


Sujet :

C++

Vue hybride

tasna Segmentation fault avec... 19/04/2012, 17h07
Bousk Bonjour, pour ton premier... 19/04/2012, 17h18
tasna ça veut dire que la mémoire... 19/04/2012, 18h06
Kalith D'après le code que tu nous... 19/04/2012, 22h19
tasna Oui mais mon memset() avait... 19/04/2012, 22h48
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2011
    Messages : 21
    Par défaut Segmentation fault avec strcpy()
    Bonjour,

    J'ai un problème avec ce code qui provoque une erreur de segmentation au niveau de la fonction strcpy() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    char *Text=new char[9];
    if(Text!=0)
    {
         memset(&Text,0,sizeof(Text));
         strcpy(Text,"01234567");
         delete[] Text;
    }
    Et je ne comprends pas pourquoi TextSz n'est pas égal à 9 dans cet exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char *Text=new char[9];
    if(Text!=0)
    {
         int TextSz=sizeof(Text);
         delete Text[];
    }
    D'avance merci de votre aide.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    pour ton premier cas, tu donnes l'adresse de Text en paramètre à memset, il va donc remplacer la valeur pointée, soit le pointeur vers le char*.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char *Text=new char[9];
    if(Text!=0)
    {
         memset(&Text,0,sizeof(Text)); // l'adresse de text est maintenant 0
         strcpy(Text,"01234567"); // tu essayes donc de copier la chaîne à l'emplacement mémoire 0
         delete[] Text; // delete 0 ne plantera pas mais la mémoire allouée ne sera pas libéré
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char *Text=new char[9];
    if(Text!=0)
    {
         memset(Text,0,sizeof(Text));
         strcpy(Text,"01234567");
         delete[] Text;
    }
    memset prend un pointeur et affectera la mémoire pointée, Text est déjà un pointeur, qui pointe sur les 9 char alloués.

    deuxième problème:
    Text* est un pointeur sur char*, sizeof te retourne la taille d'un char*, indépendament du fait que derrière se cache un char, char[2] ou char[4000].


    ps: C++ => std::string.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2011
    Messages : 21
    Par défaut
    ça veut dire que la mémoire allouée lors des essais n'a pas été libérée ?

    Etant donné que je travaille avec des chaînes de caractères de 65536 octets, ça fait beaucoup de mémoire perdue.

    Est-ce que la mémoire reste allouée à la fin de l'exécution du programme ou y'a-t-il un ramasse-miettes intégré au système ?

    Pour info je développe sous Debian 2.6.32-5-686.

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Par défaut
    Citation Envoyé par tasna Voir le message
    ça veut dire que la mémoire allouée lors des essais n'a pas été libérée ?
    D'après le code que tu nous as donné, si. L'opérateur delete (ou delete[]) "sait" combien d'octets ont été alloués dans Text. Si tu oublies de les appeler, alors la mémoire restera utilisée jusqu'à la fin du programme.

    Ton code fonctionnerait si tu avais écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char Text[9];
    memset(Text, 0, sizeof(Text));
    strcpy(Text, "01234567");
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char* Text = new char[9];
    memset(Text, 0, sizeof(char)*9); // Car ici sizeof(Text) vaut 4 ou 8 (la taille du pointeur), mais pas la taille de la chaîne
    strcpy(Text, "01234567");
    delete[] Text;
    ou, quand même vachement mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::string Text;
    Text = "01234567";

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2011
    Messages : 21
    Par défaut
    Oui mais mon memset() avait changé l'adresse sur 0.

    Mais du moment que la mémoire est libérée à la fin de l'exécution du programme ça m'arrange. Je n'aurais pas a éteindre mon PC.

    Bon je me lance...
    Qu'est ce que c'est std:: ?
    De la STL ?
    Est qu'est ce que la STL ?

  6. #6
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Santé

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Par défaut
    Citation Envoyé par tasna Voir le message
    Oui mais mon memset() avait changé l'adresse sur 0.
    Tout à fait. Ton exemple plante sur le strcpy, mais la mémoire est néanmoins toujours libérée à la sortie du programme (en principe ça dépend du système d'exploitation, mais c'est le cas pour Windows et linux).

    Citation Envoyé par tasna Voir le message
    Mais du moment que la mémoire est libérée à la fin de l'exécution du programme ça m'arrange. Je n'aurais pas a éteindre mon PC.
    Ca dépend de ton programme. Si tu fais du traitement lourd, alors il y aura nécessairement un moment ou tu n'auras plus de mémoire disponible, et là tout fout le camp. Si c'est juste un petit programme, oui ça passera. C'est très moche, et je te déconseille de prendre cette mauvaise habitude, mais ça fonctionnera.

    Citation Envoyé par tasna Voir le message
    Bon je me lance...
    Qu'est ce que c'est std:: ?
    De la STL ?
    Est qu'est ce que la STL ?
    J'ai comme un doute : tu programmes bien en C++ ?
    La STL est l'acronyme de "Standard Template Library". C'est un morceau de la bibliothèque standard du C++, qui constitue je pense l'un des plus gros atouts du langage. Comme tu peux le voir dans l'exemple ci-dessus, utiliser la STL te permet bien souvent de faire la même chose qu'en C avec moitié moins de code (et donc au minimum deux fois moins d'erreurs).
    Le préfixe std:: est un namespace (espace de nommage) réservé à la STL, dans lequel tu trouveras beaucoup de classes très utiles, comme ici string.
    Si tu veux en apprendre plus, je te conseille de lire la FAQ sur la STL.

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

Discussions similaires

  1. Segmentation fault avec strcmp
    Par FenX. dans le forum Débuter
    Réponses: 6
    Dernier message: 10/08/2007, 08h14
  2. segmentation fault avec wxGLCanvas
    Par Ardeciel dans le forum wxWidgets
    Réponses: 1
    Dernier message: 20/03/2007, 20h13
  3. Probleme de segmentation fault avec sprintf
    Par MathG dans le forum C++
    Réponses: 5
    Dernier message: 14/12/2006, 01h12
  4. Segmentation fault avec glCompressedTexImage2DARB
    Par patbier dans le forum OpenGL
    Réponses: 5
    Dernier message: 12/12/2005, 10h32
  5. Pb segmentation fault avec glutinit()
    Par pipistrelle dans le forum GLUT
    Réponses: 2
    Dernier message: 17/11/2004, 23h17

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