segfault quand tu nous tiens

segfault quand tu nous tiens - C++ - Programmation

Marsh Posté le 17-01-2007 à 20:54:16    

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
...

Reply

Marsh Posté le 17-01-2007 à 20:54:16   

Reply

Marsh Posté le 17-01-2007 à 21:09:30    

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
Reply

Marsh Posté le 17-01-2007 à 23:42:09    

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 ...

Reply

Marsh Posté le 17-01-2007 à 23:46:51    

++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)
Reply

Marsh Posté le 17-01-2007 à 23:48:21    

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

Reply

Marsh Posté le 17-01-2007 à 23:50:49    

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 ?  
 
 

Reply

Marsh Posté le 18-01-2007 à 00:05:50    

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

Reply

Marsh Posté le 18-01-2007 à 00:06:57    

-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
Reply

Marsh Posté le 18-01-2007 à 00:20:32    

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
Reply

Marsh Posté le 18-01-2007 à 09:00:15    

"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
Reply

Marsh Posté le 18-01-2007 à 09:00:15   

Reply

Marsh Posté le 18-01-2007 à 12:34:55    

vous foutez quoi avec votre C ?

Reply

Marsh Posté le 18-01-2007 à 19:34:12    

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

Reply

Marsh Posté le 23-01-2007 à 18:41:10    

++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:

Reply

Marsh Posté le 23-01-2007 à 20:58:34    

et bienvenue dans le calvaire du C

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed