paowz a écrit :
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...
|
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 :
- struct stat x;
- struct stat *pt;
- pt=&x;
|
Code :
- struct stat *pt;
- pt=malloc(struct stat);
|
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é !!!
Message édité par Sve@r le 31-05-2006 à 22:01:09
---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.