Bonjour, cliquez-ici pour vous inscrire et participer au forum.
  • Login:



+ Répondre à la discussion
Page 2 sur 2 PremièrePremière 2
Affichage des résultats 16 à 21 sur 21

c++ declaration d'un int (probleme simple)

  1. Chanur

    Date d'inscription
    septembre 2011
    Messages
    1 144

    Re : c++ declaration d'un int (probleme simple)

    Citation Envoyé par Tryss2 Voir le message
    Tu veux faire des cauchemars?


    Code:
    void foo()
    {
        for(int i=0; 1; i++)
        {
            char a = 'A';
            char c[i];
            c[i-1]=a;
        }
    }







    Ce code ne déclenche généralement pas d'erreur Les joies du C !
    Ah ? chez moi, ça plante (Erreur de segmentation (core dumped)) quand i atteint la valeur -2147483648
    Curieusement, il accepte le "int c[i];", mais dans le debugger, il dit :
    Code:
    (gdb) p c
    $1 = 0x7fffee50ab90 <Address 0x7fffee50ab90 out of bounds>

    Par contre, mon tout premier bug m'avait laissé perplexe :
    Code:
    int main ()
        {
        int i;
        int tableau[10];
        for (i=1; i<=10; i++)
            tableau[i] = 0;
        }
    ce code là (en C, pas en C++) ne plante pas, mais c'est une boucle sans fin.
    J'avoue humblement qu'à l'époque, le fait que ce soit une boucle sans fin ne m'avait pas paru évident ...

    -----

    Dernière modification par Chanur ; 15/07/2017 à 03h51.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.
     


    • Publicité



  2. Tryss2

    Date d'inscription
    août 2015
    Messages
    1 322

    Re : c++ declaration d'un int (probleme simple)

    Ça n'est pas plutôt celui ci qui ne plante généralement pas ?

    Code:
    int main ()
        {
        int tableau[10];
        int i;
        for (i=1; i<=10; i++)
            tableau[i] = 0;
        }
    Mais oui, c'est de cette idée là dont je voulais parler... on déborde du tableau et on écrit dans les autres variables qui se trouvent à coté.

    Mais pardon pour le HS
     

  3. CM63

    Date d'inscription
    juin 2006
    Localisation
    Un peu au large de la faille de Limagne
    Âge
    64
    Messages
    3 235

    Re : c++ declaration d'un int (probleme simple)

    Citation Envoyé par Chanur Voir le message
    Par contre, mon tout premier bug m'avait laissé perplexe :
    Code:
    int main ()
        {
        int i;
        int tableau[10];
        for (i=1; i<=10; i++)
            tableau[i] = 0;
        }
    ce code là (en C, pas en C++) ne plante pas, mais c'est une boucle sans fin.
    J'avoue humblement qu'à l'époque, le fait que ce soit une boucle sans fin ne m'avait pas paru évident ...
    Non, ce n'est pas une boucle sans fin. Par contre il devrait planter parce qu'il y a un débordement de tableau. Mais en fait il ne va peut-être pas planter, car l'optimiseur va se rendre compte que tu n'utilises pas les résultats et il ne va pas exécuter le code.
     

  4. Tryss2

    Date d'inscription
    août 2015
    Messages
    1 322

    Re : c++ declaration d'un int (probleme simple)

    CM63 : Le C et le C++, ça ne plante pas si tu écris en dehors d'un tableau, ça plante si tu écris sur une zone mémoire protégée.

    Il faut bien voir ce qui se passe en mémoire en général. Le code va allouer 44 octets contigus, 40 pour t, le tableau, et 4 pour i

    Code:
    Adresse : t     .    .    .    .    .    .   .    .    .    &i
    Contenu : t[0] t[1] t[2] t[3] t[4] t[5] t[6] t[7] t[8] t[9]  i
    Ensuite, il faut bien comprendre que t[n], c'est, en gros *(t+n), ce qui se trouve à l'adresse de t plus n fois la taille d'un élément. Ici, ce qui se trouve à l'adresse de t+10, c'est i, donc ça ne plante pas, mais ça écrit sur la zone mémoire de i.

    Tu peux le vérifier en testant &i == &(t[10]). Donc dans son code, quand il fait t[10] = 0, ça revient en fait à faire i=0, donc i ne va jamais dépasser 10

    Après, le résultat exact dépend fortement du compilateur, voir même, dans le cas des variables allouées, de l’exécution. Ce genre de trucs, c'est un des gros danger/problèmes du C/C++.
    Dernière modification par Tryss2 ; 19/07/2017 à 11h38.
     

  5. CM63

    Date d'inscription
    juin 2006
    Localisation
    Un peu au large de la faille de Limagne
    Âge
    64
    Messages
    3 235

    Re : c++ declaration d'un int (probleme simple)

    Oui enfin en même temps, on sait très bien qu'on déborde du tableau, et que ça a beaucoup de chance de faire n'importe quoi.
     


    • Publicité



  6. Chanur

    Date d'inscription
    septembre 2011
    Messages
    1 144

    Re : c++ declaration d'un int (probleme simple)

    Citation Envoyé par CM63 Voir le message
    Oui enfin en même temps, on sait très bien qu'on déborde du tableau, et que ça a beaucoup de chance de faire n'importe quoi.
    C'est ce que dit la norme, en fait : le comportement est "indéterminé".
    On laisse libre cours à l'imagination de l'ordinateur, quoi ...
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.
     


    • Publicité







Sur le même thème :





 

Discussions similaires

  1. Supprimer un noeud d'un arbre / problème de déclaration
    Par VeryCuriousMan dans le forum Programmation et langages, Algorithmique
    Réponses: 20
    Dernier message: 22/03/2015, 20h16
  2. déclaration en C
    Par philouxy dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 15/07/2014, 12h04
  3. probleme de declaration des timers et des interruption
    Par elmhamdi dans le forum Électronique
    Réponses: 1
    Dernier message: 07/04/2012, 19h52
  4. programmation C++, problème déclaration de string
    Par loulou40 dans le forum Logiciel - Software - Open Source
    Réponses: 4
    Dernier message: 10/01/2009, 20h34