Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3173 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  segfault quand tu nous tiens

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

segfault quand tu nous tiens

n°1504387
liouan
Posté le 17-01-2007 à 20:54:16  profilanswer
 

Bonsoir à tous,
 
Je ne vais pas etre tres original en vous disant que j'ai un segfault dnas mon tout petit bout de code et je n'en trouve pas la raison:
 
int main (void)
{
char *str1="abcdefgh";
char *str2="(abcdefgh)";
char *str3="(abcdefgh";
char *str4="abcdefgh)";
 
printf("\nYou shall not segfault\n" );
*(str1) = *(str1+1);
printf("\nyou had segfault!\n" );
return 0;
}
 
le terminal me renvoie  
 
 
You shall not segfault
Erreur de segmentation
...

mood
Publicité
Posté le 17-01-2007 à 20:54:16  profilanswer
 

n°1504393
arbitagist​e
Posté le 17-01-2007 à 21:09:30  profilanswer
 

trivial tout ca
T'es vraiment pas fait pour l'info mec.... :o

Message cité 1 fois
Message édité par arbitagiste le 17-01-2007 à 21:10:09
n°1504457
++fab
victime du syndrome IH
Posté le 17-01-2007 à 23:42:09  profilanswer
 

arbitagiste a écrit :

trivial tout ca
T'es vraiment pas fait pour l'info mec.... :o


Et bien vas-y, à toi l'honneur de donner une explication précise ...

n°1504459
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 17-01-2007 à 23:46:51  profilanswer
 

++fab a écrit :

Et bien vas-y, à toi l'honneur de donner une explication précise ...


il pourra pas, il s'est pris un ban en CDI :o


---------------
J'ai un string dans l'array (Paris Hilton)
n°1504461
++fab
victime du syndrome IH
Posté le 17-01-2007 à 23:48:21  profilanswer
 

mince alors, sa science va déjà nous manquer :o

n°1504463
-ThX-
Not here anymore
Posté le 17-01-2007 à 23:50:49  profilanswer
 

Je tente ( c'est surtout pour relancer le truc, les pointeurs et moi ca fait 2 )
char *str1="abcdefgh"; // 8 char + \0
char *str2="(abcdefgh)"; // 10 char + \0
 
c ca le probleme ?  
 
 

n°1504464
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 18-01-2007 à 00:05:50  profilanswer
 

non, le problème vient du fait qu'il déclare ses chaines comme des char* au lieu de char[]. une chaine littérale déclarée par char* n'est pas modifiable. donc forcément comme il essaie de la modifier => boum ! il est d'ailleurs conseillé de précéder la déclaration des chaines char* par un const.
 
la syntaxe correcte aurait été d'écrire :

Code :
  1. char str1[]="abcdefgh";
  2. *(str1)=*(str1+1);


 
et là, plus de segfault

n°1504465
++fab
victime du syndrome IH
Posté le 18-01-2007 à 00:06:57  profilanswer
 

-ThX- a écrit :

Je tente ( c'est surtout pour relancer le truc, les pointeurs et moi ca fait 2 )
char *str1="abcdefgh"; // 8 char + \0
char *str2="(abcdefgh)"; // 10 char + \0

 

c ca le probleme ?


Je ne vois pas où tu veux en venir.
La string littérale est un cas un peu à part.
"abcdefgh" est comme un tableau de 9 char const, à classe de stockage "static".
Corrollaire, modifier une string litérale est un comportement indéfini. Je ne vois pas du tout ce que le PO essayais de faire dans son exemple, mais clairement, il modifiait la string littérale.

Message cité 1 fois
Message édité par ++fab le 18-01-2007 à 00:12:57
n°1504466
++fab
victime du syndrome IH
Posté le 18-01-2007 à 00:20:32  profilanswer
 

Harkonnen a écrit :

non, le problème vient du fait qu'il déclare ses chaines comme des char* au lieu de char[]. une chaine littérale déclarée par char* n'est pas modifiable.


char toto[] = "pouetpouet";

 

toto est un tableau de char, de classe de stockage *automatique*. Il est alors facultatif au compilateur de stoquer la string littérale en "mémoire static", mais il peut quand même le faire. Et comme tu le dis, on peut bien modifier les cacractères de ce tableau.

 


Message édité par ++fab le 18-01-2007 à 00:21:13
n°1504486
stabia
Posté le 18-01-2007 à 09:00:15  profilanswer
 

"valeurs, pointeurs et références" ... vaste sujet ! et, même pour un programmeur chevronné, source d'erreurs.
Pour comprendre, ou lorsque vous suspectez ce problème, le plus simple est de mettre un point d'arret, d'exécuter, et là de passer en vision "code machine" sur le débogueur, vous verrez immédiatement ce qu'a fait le compilateur. Par exemple un déréférencement genre "mov eax, [eax]" ou un pointage "lea eax, monStock", ensuite il suffit d'aller voir à l'adresse "eax" si vous retrouvez vos petits.


Message édité par stabia le 18-01-2007 à 09:01:37
mood
Publicité
Posté le 18-01-2007 à 09:00:15  profilanswer
 

n°1504581
Taz
bisounours-codeur
Posté le 18-01-2007 à 12:34:55  profilanswer
 

vous foutez quoi avec votre C ?

n°1504756
++fab
victime du syndrome IH
Posté le 18-01-2007 à 19:34:12  profilanswer
 

On passait en revu une ou deux constructions un peu dangereures issues du C, et légales en C++.

n°1506457
riboulon
Posté le 23-01-2007 à 18:41:10  profilanswer
 

++fab a écrit :


La string littérale est un cas un peu à part.


 
Bin oui, c'est parce que tous ses pointeurs pointent vers des chaines littérales, qui sont stockées globalement quelque part et ne sont pas modifiables !
 
Pour pouvoir modifier les chaines, il faut copier le contenu des chaines littérales. (avec strcpy ou strdup par exemple)
On peut faire comme ça :

Code :
  1. #include "stdafx.h"
  2. #include "string.h"
  3. int main(int argc, char* argv[])
  4. {
  5. char *str1=strdup("abcdefgh" );
  6. char *str2=strdup("(abcdefgh)" );
  7. char *str3=strdup("(abcdefgh" );
  8. char *str4=strdup("abcdefgh)" );
  9. printf("\nYou shall not segfault\n" );
  10. *(str1) = *(str1+1);
  11. printf("\nyou had segfault!\n" );
  12. printf("Hello World!\n" );
  13. return 0;
  14. }


ne pas oublier de faire un free dessus, après :hello:

n°1506487
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 23-01-2007 à 20:58:34  profilanswer
 

et bienvenue dans le calvaire du C


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  segfault quand tu nous tiens

 

Sujets relatifs
Segfault ?[ C ] Archi-debutant segfault sur petit programme :-(
[XSL][JAVASCRIPT] Document.write => Segfault[MinGW/Boost.Thread] Segfault multi-threading
PERL : traquer une segfault 
Plus de sujets relatifs à : segfault quand tu nous tiens


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)