segfault quand tu nous tiens - C++ - Programmation
Marsh Posté le 17-01-2007 à 21:09:30
trivial tout ca
T'es vraiment pas fait pour l'info mec....
Marsh Posté le 17-01-2007 à 23:42:09
arbitagiste a écrit : trivial tout ca |
Et bien vas-y, à toi l'honneur de donner une explication précise ...
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
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 ?
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 :
|
et là, plus de segfault
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 ) 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.
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.
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.
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++.
Marsh Posté le 23-01-2007 à 18:41:10
++fab a écrit : |
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 :
|
ne pas oublier de faire un free dessus, après
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
...