Erreur de Segmentation - C - Programmation
Marsh Posté le 31-05-2006 à 21:48:42
je vous colle un cas d'erreur de segmentation avant meme que les strcmp soient utilisés...
il apparaît lorsque j'utilise:
int i = stat(dir->d_name,st_dir);
avec
Code :
|
déclaré en pointeur vers la structure...
alors qu'en déclarant la structure sur la pile (struct stat st_dir) et en faisant:
int i = stat(dir->d_name,&st_dir);
.. ben ca marche...
Code :
|
Marsh Posté le 31-05-2006 à 21:50:33
et genre alloué t'as mémoire ?? t'y pense de temps en temps ?
Marsh Posté le 31-05-2006 à 21:54:13
paowz a écrit : Mais je déclare vers le tas, en passant par un pointeur, comme suit: |
Au lieu d'utiliser une variable de type "struct stat", tu utilises un pointeur, ok. Mais es-tu certain que ce pointeur pointe vers une zone mémoire suffisamment grande pour stocker tout le contenu d'un "struct stat" ???
Lorsqu'on utilises un pointeur "<type> *pt", quel que soit le type, il ne faut jamais aller toucher à "*pt" si on n'a pas fait auparavant "pt=<qqchose>"
Exemples
Code :
|
Code :
|
Tu passes à la fonction "stat" une adresse d'un "struct stat". Il faut bien que tu comprennes que "stat()" va aller remplir la zone mémoire pointée par cette adresse !!!
paowz a écrit : quand j'utilise ensuite la fonction strcmp(), fonction qui n'utilise aucun des champs renvoyés par la fonction stat(), je me retrouve avec une erreur de segmentation à l'exécution... alors qu'il n'y a aucun lien (en apparence du moins..) |
Comme tu le dis, "en apparence". Ptet que "pt" va pointer vers une zone utilisée par la variable que tu utilises dans "strcmp()". En utilisant "pt" sans garantir sa valeur, tu es entré dans un "no-man's land" de comportements indéfinis.
Ce genre de truc peut très bien fonctionner parce que, par chance, "pt" pointe vers une zone libre. Puis, 6 mois plus tard, tu rajoutes juste printf("Hello\n" ); et là, t'as un superbe "memory fault" parce cette ligne est située pile poil dans la zone pointée par "pt". Mais va donc retrouver l'erreur 6 mois après. Et toi, tu reviens ici ouvrir un nouveau topic pour dire que "printf()" est buggé !!!
Marsh Posté le 01-06-2006 à 00:26:09
Ok..merci, Sve@r.
Ma connerie était d'envoyer des données vers un pointeur qui n'a même pas été initialisé..donc forcément, on peut pas savoir où ca pointe..
C'est très clair
mais comment se fait-il que:
Code :
|
..marchait ?
Ca devait être un simple hasard, vraisemblablement..
Marsh Posté le 01-06-2006 à 18:54:11
paowz a écrit : Ca devait être un simple hasard, vraisemblablement.. |
Exactement. D'où le terme "comportement imprévisible"...
Marsh Posté le 02-06-2006 à 18:38:22
Sve@r a écrit : Exactement. D'où le terme "comportement imprévisible"... |
"Comportement Indeterminé" (Undefined Behaviour ou UB)est le terme exact...
Marsh Posté le 31-05-2006 à 21:26:24
Bonjour à tous,
Une erreur me chagrine en prog C-Ansi sous unix, je n'arrive pas à m'en défaire.
voici le prototype de stat():
int stat(const char *file_name, struct stat *buf);
le deuxieme argument est un pointeur vers un buffer..ok..
Dans la doc, la structure stat est déclarée comme cela:
struct stat mon_buf;
..impliquant l'utilisation de la fonction stat() de cette manière:
int i = stat("....",&mon_buf);
Mais je déclare vers le tas, en passant par un pointeur, comme suit:
struct stat *mon_buf;
et je l'utilise comme ca:
int ret = stat("....",mon_buf);
Ca marche...mais...
...quand j'utilise ensuite la fonction strcmp(), fonction qui n'utilise aucun des champs renvoyés par la fonction stat(), je me retrouve avec une erreur de segmentation à l'exécution... alors qu'il n'y a aucun lien (en apparence du moins..)
Avez-vous une idée de ce qu'il peut se passer, à ce moment là ?
Cdt.