Partage
  • Partager sur Facebook
  • Partager sur Twitter

compilation qui ne plante pas!

c'est pas "normal" !

Sujet résolu
Anonyme
    20 juillet 2006 à 21:54:51

    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
            char tableau[3] = {0};
            sprintf(tableau,"christian");
            printf("%s",tableau);
            return EXIT_SUCCESS;
    }


    voilas j'ai crée une chaine de caractère d'une taille de 3.
    logiquement elle ne peut contenir que le 'c' et le 'h' ainsi que l'inévitable '\0' .Mais voilas que quand dans ce tableau de 3 caracteres j'ecrit une chaine de 9 caracteres ainsi que le '\0' ce qui me fait normalement en tout 10 caracteres! Et ben "sprintf" ecrit quand même dans ce tableau et printf affiche sans probleme toute la chaine "christian" ?? !!!! ?? qui logiquement est contenue dans ce tableau de 3 case ne pouvant pas la contenir ! :(:euh::o

    a la compilation 0 warning 0 error ! o_Oo_O

    pourquoi la compilation ne plante t-elle pas?


    Merci d'avance!
    • Partager sur Facebook
    • Partager sur Twitter
      20 juillet 2006 à 22:12:17

      Essaie de mettre "1" à la place de "3" et tu verra.
      Il y'aura une fuite de mémoire :) .
      • Partager sur Facebook
      • Partager sur Twitter
        20 juillet 2006 à 22:14:18

        Je pense pas que ce sois une question de fuite mémoire c'est juste que tu viens écraser des données en mémoire pour écrire ta chaîne. Les effets peuvent etre aleatoires
        • Partager sur Facebook
        • Partager sur Twitter
          20 juillet 2006 à 22:21:12

          une fuite de memoire c'est lorsque ton programme pompe ta RAM jusqu'a.....
          C'est plutot une erreur de segmentation (debordement)
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            20 juillet 2006 à 22:22:25

            mais ! deja sans parler de fuite de memoire
            Comment sa ce fait quil puisse ecrire dedans??!!


            a je vien de pigé! je vais mettre ma paté chez les autre! c sa!

            exmple:
            c comme si je veux garer mon tank dans mon garage et que je ne peu pas alors je defonce le mur du fond pour pouvoir le garer.

            en gros en fessans sa je doit perturber certain programme! aa ok

            MAIS? pk windows ne marrete til pas?!
            • Partager sur Facebook
            • Partager sur Twitter
              20 juillet 2006 à 22:37:36

              en fait tu ecrases pas la maison des voisins.
              C'est ta maison qui s'ecroule.
              Il est pratiquement impossible d'ecraser la zone memoire d'un autre processus* a part si tu connais l'id du segment de memoire alloue par le processus.

              *processus : etant soit le programme lui meme, soit une partie de programme.
              • Partager sur Facebook
              • Partager sur Twitter
                20 juillet 2006 à 22:39:18

                Tan que tu reste dans ton programme, windows il te fait pas chier.
                En fait avec ce que tu as fait, tu écrase les données après tableau[3], mais on ne sait pas ce qu'il y a après, ca peut très bien etre un peu de vide ou alors qqchose de pas très important, mais c'est peut etre aussi une autre variable et dans ce cas tu modifiera le contenu de celle-ci

                Pour reprendre ton exemple du tanck, au final tu as bien réussi à le garrer mais tu a modifier le contenu de ton salon en meme temps (le salon etait mitoyen au garage ^^)
                • Partager sur Facebook
                • Partager sur Twitter
                  20 juillet 2006 à 23:32:17

                  Citation : charly90

                  #include <stdio.h>
                  #include <stdlib.h>

                  int main()
                  {
                          char tableau[3] = {0};
                          sprintf(tableau,"christian");
                          printf("%s",tableau);
                          return EXIT_SUCCESS;
                  }



                  voilas j'ai crée une chaine de caractère d'une taille de 3.
                  logiquement elle ne peut contenir que le 'c' et le 'h' ainsi que l'inévitable '\0'.


                  Exact.

                  Citation : Pas de titre


                  Mais voila que quand dans ce tableau de 3 caracteres j'ecrit une chaine de 9 caracteres ainsi que le '\0' ce qui me fait normalement en tout 10 caracteres! Et ben "sprintf" ecrit quand même dans ce tableau et printf affiche sans probleme toute la chaine "christian" ?? !!!! ?? qui logiquement est contenue dans ce tableau de 3 case ne pouvant pas la contenir ! :(:euh::o

                  a la compilation 0 warning 0 error ! o_Oo_O

                  pourquoi la compilation ne plante t-elle pas?



                  Parce que le C n'est pas un langage de débutant en informatique. Il s'adresse à des programmeurs qui savent ce qu'ils font. Ici, il n'y a pas d'erreur de syntaxe (le compilateur n'a donc rien à dire), mais tu fais n'importe quoi, et le comportement est indéterminé.

                  Il peut arriver n'importe quoi, y compris un comportement d'apparence normal ce qui rend les tests 'boite noire' caducs en C. Il faut un contrôle visuel du code.

                  Citation : Oussama1305

                  Essaie de mettre "1" à la place de "3" et tu verra.
                  Il y'aura une fuite de mémoire :) .


                  o_Oo_Oo_O Mais c'est quoi ce délire ? Si tu ne sais pas, ne dit rien et écoute... Mais STP, ne raconte pas n'importe quoi. On perd son temps à corriger ensuite...


                  Citation : richidi

                  une fuite de memoire c'est lorsque ton programme pompe ta RAM jusqu'a.....
                  C'est plutot une erreur de segmentation (debordement)


                  Mais arrétez de raconter n'importe quoi. C'est la chaleur ou quoi ?

                  Une fuite mémoire c'est pas un débordement mémoire. C'est quand on fait un malloc() sans free(). C'est tout.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Music only !
                  Anonyme
                    21 juillet 2006 à 0:05:35

                    MERCI ED :D !

                    je tadore ...

                    PS: je savai tres bien ce que je fesai mais je me suis rendu compte par une erreur d'inatention que cela semblait "fonctionner" mais! avec un peu de raissonnement et les quelques "regles" que j'ai , je me suis de plus en plus convaincue que j'aivai fait nimportequoi. Je voulai juste une coonfirmation de ta part

                    merci a toi :D !!
                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 juillet 2006 à 0:07:10

                      Citation : -ed-

                      Citation : charly90

                      #include <stdio.h>
                      #include <stdlib.h>

                      int main()
                      {
                              char tableau[3] = {0};
                              sprintf(tableau,"christian");
                              printf("%s",tableau);
                              return EXIT_SUCCESS;
                      }



                      voilas j'ai crée une chaine de caractère d'une taille de 3.
                      logiquement elle ne peut contenir que le 'c' et le 'h' ainsi que l'inévitable '\0'.


                      Exact.

                      Citation : Pas de titre


                      Mais voila que quand dans ce tableau de 3 caracteres j'ecrit une chaine de 9 caracteres ainsi que le '\0' ce qui me fait normalement en tout 10 caracteres! Et ben "sprintf" ecrit quand même dans ce tableau et printf affiche sans probleme toute la chaine "christian" ?? !!!! ?? qui logiquement est contenue dans ce tableau de 3 case ne pouvant pas la contenir ! :(:euh::o

                      a la compilation 0 warning 0 error ! o_Oo_O

                      pourquoi la compilation ne plante t-elle pas?



                      Parce que le C n'est pas un langage de débutant en informatique. Il s'adresse à des programmeurs qui savent ce qu'ils font. Ici, il n'y a pas d'erreur de syntaxe (le compilateur n'a donc rien à dire), mais tu fais n'importe quoi, et le comportement est indéterminé.

                      Il peut arriver n'importe quoi, y compris un comportement d'apparence normal ce qui rend les tests 'boite noire' caducs en C. Il faut un contrôle visuel du code.

                      Citation : Oussama1305

                      Essaie de mettre "1" à la place de "3" et tu verra.
                      Il y'aura une fuite de mémoire :) .


                      o_Oo_Oo_O Mais c'est quoi ce délire ? Si tu ne sais pas, ne dit rien et écoute... Mais STP, ne raconte pas n'importe quoi. On perd son temps à corriger ensuite...


                      Citation : richidi

                      une fuite de memoire c'est lorsque ton programme pompe ta RAM jusqu'a.....
                      C'est plutot une erreur de segmentation (debordement)


                      Mais arrétez de raconter n'importe quoi. C'est la chaleur ou quoi ?


                      Une fuite mémoire c'est pas un débordement mémoire. C'est quand on fait un malloc() sans free(). C'est tout.


                      Euh ... excuse moi si j'ai dis n'importe quoi, car je croyais que ça venait de ça : car j'ai eu une erreur disant que c'est une faute niveau mémoire.
                      Bon, c'est toi le chef.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 juillet 2006 à 1:41:26

                        Je rajouterai d'utiliser snprintf au lieu de sprintf aussi :-)...
                        Parce que la il te rajoute des données tant qu'elles tombent sur une page allouée... (Mais dès que tu tombe sur une zone mémoire ne correspondant a aucune page dans tes PTE/PDE tu recois un SEGFAULT...)
                        Donc pour éviter les écrasements, snprintf te permet de te stopper a un moment précis.
                        Il vaut mieux éviter les fonctions à comportements aléatoires (comme scanf en autre exemple) en C, même si elles sont standardisées (Il faut les utiliser quand on sait qu'il n'y a aucun risque, ce qui est rare pour un scanf, surtout avec un stdin ou on attend les touches tapées par l'utilisateur)...
                        Cordialement,
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          21 juillet 2006 à 13:06:15

                          a ok je voi :D ! merci ! pour la fonction snprintf ! et a -ed- et m'avoir rassuré et plus! de m'avoir expliqué (si j'ai bien comprit :honte: ) que le language C est un language très libre.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            21 juillet 2006 à 15:29:18

                            En parlant de fuites de mémoires, de malloc et de free, il me semble que faire un malloc sans free dans une fonction c'est pas grave, puisque la mémoire de la fonction sera libérée ensuite non?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              21 juillet 2006 à 15:34:56

                              une note pour -ed-
                              J'ai jamais dit qu'une fuite de memoire etait un debordement. Oh mon dieu !!! ca serait terrible
                              Je me suis peut etre mal exprimer...

                              pour Arkhiall
                              Faux, la memoire est liberee uniquement par l'OS apres que le programme soit terminee.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                21 juillet 2006 à 19:40:24

                                Citation : richidi


                                pour Arkhiall
                                Faux, la memoire est liberee uniquement par l'OS apres que le programme soit terminee.


                                Ca dépend de l'implémentation.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Music only !
                                Anonyme
                                  22 juillet 2006 à 4:43:42

                                  Une fuite de mémoire c'est:

                                  Secret (cliquez pour afficher)

                                  Quand un programme alloue de la mémoire et ne la libère pas, rendant une partie de la memoire vive "innacessible", sauf après un redémarrage.


                                  Un débordement de mémoire je croit que c'est:

                                  Secret (cliquez pour afficher)
                                  Quand un programme ou un ensembles de programmes arrivent a utilisés la totalité des mémoires vives disponibles et les satures de manière à ce qu'aucun n'autres programmse ne s'éxécutent.


                                  Un écrasement de mémoire c'est:

                                  Secret (cliquez pour afficher)
                                  Quand un programme écrit en dehors de la mémoire qu'il a alloué.


                                  ah! et une petite question a -ed-
                                  si on est un gros nul en anglais parcequ'un:

                                  un ado de 3ème qui atteint parcequ'il n'a pas vraiment bossé les 9 de moyenne en anglais Peut-il se "rattrapé" de là a parler l'anglais couramment? :'( (en lisant des petites docs de 5-10 lignes d'anglais decrivant des fonctions sur msdn,en apprenant par coeur les 85 verbes irrégulier, en apprenant par "mieux" les règles de grammaire, de conjugaisons, et a essayer de cherché du vocabulaire à droite, à gauche :euh: )

                                  Et esque le "temps" à force de lire des "truc anglais" peut nous faire quasiment "disparaitre" notre language natal et la remplacé par l'anglais ?
                                  sinon comment "supprimé" le français de ma tête en gros ^^ pour que je n'est plus la possibilité de le parlé, mais à la place de mettre "l'anglais".

                                  Merci d'avance!
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    22 juillet 2006 à 10:28:36

                                    Citation : charly90

                                    Un débordement de mémoire je croit que c'est:
                                    Quand un programme ou un ensembles de programmes arrivent a utilisés la totalité des mémoires vives disponibles et les satures de manière à ce qu'aucun n'autres programmse ne s'éxécutent.


                                    Je parlerais plutôt de "saturation de la mémoire" ou de "surhcarge mémoire".
                                    (memory overflow ou plutôt memory overload)

                                    Citation : Pas de titre


                                    ah! et une petite question a -ed-
                                    si on est un gros nul en anglais parcequ'un:

                                    un ado de 3ème qui atteint parcequ'il n'a pas vraiment bossé les 9 de moyenne en anglais Peut-il se "rattrapé" de là a parler l'anglais couramment? :'( (en lisant des petites docs de 5-10 lignes d'anglais decrivant des fonctions sur msdn,en apprenant par coeur les 85 verbes irrégulier, en apprenant par "mieux" les règles de grammaire, de conjugaisons, et a essayer de cherché du vocabulaire à droite, à gauche :euh: )

                                    Et esque le "temps" à force de lire des "truc anglais" peut nous faire quasiment "disparaitre" notre language natal et la remplacé par l'anglais ?


                                    Si tu vis dans un milieu qui parle ta langue natale, non. Sinon, au pire, tu perds quelques expressions, quelques mots, mais le fond reste. Une langue de remplace pas une autre. Surtout la langue maternelle.

                                    Citation : Pas de titre


                                    sinon comment "supprimé" le français de ma tête en gros ^^ pour que je n'est plus la possibilité de le parlé, mais à la place de mettre "l'anglais".


                                    Supprimmer, c'est pas possible, par contre, arriver à comprendre sans traduire, c'est possible avec un peu d'habitude et des séjours long dans les pays pratiquant la langue concernée. Mais tu as raison, il faut connaître les bases.

                                    Pour savoir lire les docs écrites en anglais, tu n'as pas besoin de tout ça.

                                    Juste un peu de grammaire, pas mal de vocabulaire (il y a des dictionnaires spécialisés pour éviter les contre-sens), et, si besoin est, de bonnes lunettes pour ne pas lire de travers. C'est tout.

                                    Tu peux aussi proposer ta traduction de tel ou tel passage difficile (poster aussi l'original) et on corrigera si nécessaire (ça donne parfois des débats intéressants, surtout quand on s'attaque à la norme!)
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Music only !
                                    Anonyme
                                      22 juillet 2006 à 11:27:04

                                      oki merci de ta réponse ! :D
                                      dommage qu'on ne peu pas "enlever le français" :'(
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        22 juillet 2006 à 12:46:12

                                        Tu vas dans :
                                        Cerveau\Connaissances\Langage\Langues_connues\ et tu auras un fichier fr.lang ! Tu peux le supprimer si tu ne veux plus parler français, ou tu peux le garder et téléchargé sur le net un fichier en.lang que tu mettras dans ce même dossier, et ce sera bon, tu parleras anglais !

                                        Tu peux trouver plusieurs fichiers lang : de.lang (deutsch), sp.lang (spanish), be.lang (belge), sch.lang (suisse), ... Les langues européennes se trouvent facilement : ce sont ces pays qui sont les plus développés au niveau du web ! Si tu arrives à télécharger le torrent pour le mali, ça m'intéresse !
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Anonyme
                                          22 juillet 2006 à 13:17:24

                                          LOOOOOoooooOOOOOL :D:lol: pas "physiquement"
                                          mais je me demandais juste es qu'a force de vivre dans une "langue" on fini par oubliez le français completement. malheureusement non
                                          ...
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            23 juillet 2006 à 2:02:22

                                            Citation : charly90

                                            LOOOOOoooooOOOOOL :D:lol: pas "physiquement"
                                            mais je me demandais juste es qu'a force de vivre dans une "langue" on fini par oubliez le français completement. malheureusement non
                                            ...


                                            Pourquoi malheureusement ? Le français est une belle langue ... J'aimerais bien parler russe, arabe egyptien ou mandarin, mais je ne renierai pas le français pour autant ...


                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Music only !

                                            compilation qui ne plante pas!

                                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                            • Editeur
                                            • Markdown