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 :

pourquoi ça fonctionne ?


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Points : 46
    Points
    46
    Par défaut pourquoi ça fonctionne ?
    slt j'ai écrit un bout de code qui lorsqu'on l'exécute doit normalement causer un bug mais a ma grande surprise ça fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int main()
    {
        char* t;
        t=new char[10];
        t="toto";
        puts(t);
         delete []t; //libération du pointeur
         puts(t);//ça marche !
        return 0;
    }
    si quelqu'un peut m'expliquer comment ça a bien pu fonctionner je lui serais reconnaissant.
    Merci

  2. #2
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Salut, la tu as juste libéré la mémoire.
    En fait, quand tu libères de la mémoire, elle reste inchangée, c'est juste qu'elle peut être utilisée comme espace de stockage par une autre variable.

    Apparement, là, ça veut dire que pour l'instant aucune variable ou chose extérieure n'a occupé cet espace, mais je suis sûr que si tu arrives 1000 lignes de codes plus loin, alors là ça ne t'afficheras plus ToTo.

    Enfin, là tu ne touche pas à la mémoire, tu ne fais que la lire, donc je crois pas que ça puisse causer un quelconque bug.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    La je me demande comment ça peut compiler, tu stockes un const char* dans un char*.

  4. #4
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Ah oui j'avais pas capté.

    En fait en faisant ça tu changes carrément l'adresse que contient le pointeur.

  5. #5
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Points : 46
    Points
    46
    Par défaut
    la je me demande comment ça peut compiler, tu stockes un const char* dans un char*.
    >j'utilise code::blocks sous win Xp et il n'a afficher aucun warnings.
    Ah oui j'avais pas capté.
    En fait en faisant ça tu changes carrément l'adresse que contient le pointeur.
    >Désolé j'ai pas compris comment ça peut changer l'adresse du pointeur.

  6. #6
    Membre expérimenté
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Points : 1 452
    Points
    1 452
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	char *a = new char[10];
     
    	cout << (void*) a << endl;
     
    	a = "abc";
     
    	cout << (void*) a << endl;
    Ce que tu vois affiché ce sont les adresses des pointeurs.

    Quand tu fais directement a = ...., vu que a est une variable qui contient une adresse, que veux-tu qu'il fasse d'autre que changer cette adresse? (vers une zone qui contient "abc")
    Si tu veux changer la mémoire pointée, utilise strcpy.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    C'est au delete[] que ça devrait planter, puisque tu deletes un pointeur qui n'est plus le pointeur retourné par un new (à la place, il pointe désormais sur une chaîne litérale)

    zais_ethael: Les chaînes littérales sont en lecture seule, mais ne sont pas const dans le standard (va savoir pourquoi). Il faut utiliser l'option -Wwrite-strings de gcc pour que les chaînes littérales deviennent const. Hélas, je n'en connais aucun équivalent sous Visual.

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Les chaînes littérales sont en lecture seule, mais ne sont pas const dans le standard
    Si si, elles le sont, contrairement à C.

    Citation Envoyé par C++ Standard, 2.13/2
    An ordinary string literal has type “array of n const char”, where n is the size of the string as defined below; it has
    static storage duration (3.7) and is initialized with the given characters.
    Mais pour des raisons de compatibilité, il y a certains cas où enlever le const est autorisé. (il me semble)

  9. #9
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 112
    Points : 46
    Points
    46
    Par défaut
    Merci bcp

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Si si, elles le sont, contrairement à C.

    Mais pour des raisons de compatibilité, il y a certains cas où enlever le const est autorisé. (il me semble)
    Ah, OK, au temps pour moi.

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

Discussions similaires

  1. pourquoi linux fonctionne même avec un programme qui fait une boucle while(1) ?
    Par morpheusmg dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 23/12/2011, 17h49
  2. pourquoi cela fonctionne dans un cas et pas dans l'autre ?
    Par Attila54 dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 01/10/2010, 15h40
  3. Pourquoi Free fonctionne dans un cas et pas dans l'autre
    Par BuzzLeclaire dans le forum Langage
    Réponses: 8
    Dernier message: 25/01/2009, 14h04
  4. Pourquoi Firefox fonctionne et pas IE ?
    Par dinette dans le forum Dreamweaver
    Réponses: 0
    Dernier message: 12/10/2008, 13h42
  5. Réponses: 6
    Dernier message: 11/07/2007, 13h29

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