France Hardware : Forums de discussion - Découvrez notre nouveau comparateur d'offres Internet
Retrouvez les prix près de chez vous :  
Index du forum | Liste des membres | Liste des groupes | Inscription | F-A-Q | Recherche
Pseudo :    Password :     
29 521 membres enregistrés - 2 069 420 posts - 122 057 topics
Index des forums FH  | Index des forums DegroupNews
      Programmation
           Langages
                programme en c: glibc detected
112 connectés(record : 2799 le 29 May 2016 - 15 h 34)

Vous devez vous connecter pour répondre au topic.
programme en c: glibc detected

chamank


Messages : 7
Inscrit le 24/04/06
Non connecté
  Posté le 17 May 2006 - 22 h 34 m 27 s
Bon voilà j'ai fait un ti programme pour m'aider dans la configuration du wifi de ma carte intégré mais impossible d'écrire dans le fichier correctement à cause d'une erreur dont je ne trouve pas la solution.
Au moment où le programme doit écrire dans un fichier, il me renvoit cette erreur:

*** glibc detected *** free(): invalid next size (normal): 0x0804a038 ***
Abandon

J'ai bien vérifié les malloc que j'ai utiliser et je pense qu'il n'y a pas d'erreur(s) (je pense...) et j'ai aussi libéré l'espace attribué avec free. Par contre j'hésite à poster le code (il fait quand même 100 lignes...).
Voilà si une âme charitable pouvait m'aider...
(je précise quand même que je débute en C, je ne suis donc pas à l'abris d'erreur :D )




Petit_PimoOosE
rsqrtps & pshufb

Messages : 4 617
Inscrit le 15/06/03
Ville : Montréal
Non connecté
  Posté le 18 May 2006 - 02 h 29 m 56 s
À défaut de poster le code, tu peux peut-être nous permettre de le télécharger quelque part - ou l'envoyer par MP.
Parce que là, ça va pas être facile :-D

Ou sinon, donne toujours la dizaine de lignes qui entourent celle où l'erreur se produit.



Huile de fraise.

bernie38
Waldorf (le pote à Statler)

Messages : 11 452
Inscrit le 28/08/03
Ville : Claix
Non connecté
  Posté le 18 May 2006 - 12 h 39 m 03 s
comme ça, brutalement, tu n'essaierais pas de faire un free d'une zone pour la quelle que tu n'as jamais fait de malloc ? en totu cas, ça y ressemble fortement...



La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire


chamank


Messages : 7
Inscrit le 24/04/06
Non connecté
  Posté le 18 May 2006 - 14 h 22 m 34 s
voilà le lien pour le code:
http://kchaman.googlepages.com/_wifi.c
désolé de en pas y avoir pensé plus tôt :roll: .

Au début je me demandé si cela ne venait pas des malloc pour lesquels je n'avais pas attribué assez d'espace mais en fait je me suis rendu compte que ça ne changeais rien donc depuis quelque temps déjà je bute sur le prob.

Pour répondre à Bernie38, je ne pense pas en avoir fait, après j'ai pu faire une autre erreur quelque part, que je n'ai pas remarqué (pas encore en tout cas).
Juste un autre détail, je ne sais pas s'il sera utile, mais à la compilation je n'obtiens ni warning, ni erreur...




bernie38
Waldorf (le pote à Statler)

Messages : 11 452
Inscrit le 28/08/03
Ville : Claix
Non connecté
  Posté le 18 May 2006 - 18 h 12 m 37 s
juste quelques remarques en passant :
le proto exact de main() est : int main(void) ou int main (int argc, char **argv)

En C, sizeof char est TOUJOURS égal à 1.

Caster des malloc : sauf dans quelques cas très spécifiques, il ne faut jamais le faire : ça pourrait masquer l'absence d'un #include et tromper le compilo (aucune erreur listée). Il se trouve que tu as bien inclus stdlib.h, mais autant prendre de bonnes habitudes...

D'autre part, et plus important, tu fais des malloc, certes. Mais tu ne testes pas le code retour : qui te prouve que le malloc a réussi à allouer ?

Et enfin, last but not least : tu fais des malloc de sizeof char, soit 1 caractère. ça suffit j'espère ? ;-) Je pense que là, tu tiens ta solution, non ?



La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire


chamank


Messages : 7
Inscrit le 24/04/06
Non connecté
  Posté le 18 May 2006 - 19 h 16 m 39 s
Merci beaucoup, le problème venait bien de là :yes: . Par contre ce qui m'étonne un peu c'est qu'auparavant j'avais déjà alloué un certain espace mais j'avais le même genre d'erreur. Enfin je n'avais surement pas assez d'espace d'alloué, ou bien il y avait déjà une erreur qui en entrainait une autre.

Au risque de passer pour un boulet (je tente quand même... :D ), comment tu fais tu tester le code de retour du malloc? Un return 0 me vient à l'esprit mais je ne suis pas sûr...

Avant ça tu me disais que le cast de malloc est à éviter. Si je comprends bien:
char *var;
var=(char *) malloc(50*sizeof(char)); ça ne serait pas bon, mais:


char *var;
*var=(char *) malloc(50*sizeof(char)); le serait? enfin en partant du principe que ce que je viens d'écrire est bon, gcc me renvoit un warning (attention : assignment makes integer from pointer without a cast) et le prog ce termine sur un seg fault.
Enfin je veux bien deux ou trois explications si ça ne te dérange pas. :)




bernie38
Waldorf (le pote à Statler)

Messages : 11 452
Inscrit le 28/08/03
Ville : Claix
Non connecté
  Posté le 18 May 2006 - 19 h 47 m 35 s


Le 18 mai 2006 - 19 h 16, chamank a écrit :
Merci beaucoup, le problème venait bien de là :yes: . Par contre ce qui m'étonne un peu c'est qu'auparavant j'avais déjà alloué un certain espace mais j'avais le même genre d'erreur. Enfin je n'avais surement pas assez d'espace d'alloué, ou bien il y avait déjà une erreur qui en entrainait une autre.

Au risque de passer pour un boulet (je tente quand même... :D ), comment tu fais tu tester le code de retour du malloc? Un return 0 me vient à l'esprit mais je ne suis pas sûr...

Penser à se faire offrir un livre de C, par exemple : le K&R :)
Bon. Pour tester le retour de malloc :
if (malloc(mazone, 50) == NULL)
{
printf "erreur allocation etc etc";
exit(mon_code_retour_pour_erreur);
}

de manière générale, on fait :
rc = mafonction(...);
rc étant le code retour (habituellement un int), 0 étant le code "OK", et les autres codes... ceux que tu veux tester.


Avant ça tu me disais que le cast de malloc est à éviter. Si je comprends bien:
char *var;
var=(char *) malloc(50*sizeof(char)); ça ne serait pas bon, mais:


char *var;
*var=(char *) malloc(50*sizeof(char)); le serait? enfin en partant du principe que ce que je viens d'écrire est bon, gcc me renvoit un warning (attention : assignment makes integer from pointer without a cast) et le prog ce termine sur un seg fault.
Enfin je veux bien deux ou trois explications si ça ne te dérange pas. :)

pfouuuuuu ! tu es un dilettante du C, hein ? c'est pas du tout péjoratif, tu essaies de te débrouiller et c'est bien, mais le C ne supporte pas l'approximation. C'est pas du basic ou du php, désolé.
quand tu fais (char *) malloc(50 etc etc), tu castes malloc en char * ; dans la plupart des cas : pas bon !!!
var = malloc(50); ira très bien, puisque sizeof char == 1
sizeof sans parenthèses, sizeof n'étant pas une fonction mais si tu veux, tu peux en mettre autant que tu veux : sizeof(((((((((size of int))))))))) marche très bien, même si ça nuit un peu à la lisibilité ;-)

*var = malloc(....) -> tu alloues un pointeur d'un pointeur, aïe !!! N'oublie pas que malloc() alloue déjà un pointeur ! Maintenant, si tu veux travailler avec des pointeurs de pointeurs, ça marche, mais bon, vaut mieux commencer avec du simple...

Pour me répéter : si tu dois faire du C, cherche sur le net des ressources, achète un bouquin pour bien débuter. Parce que les mauvaises habitudes sont vite prises, et le C ne supporte pas le flou artistique.
Je maintiens des programmes en C de plusieurs milliers de lignes, et quand c'est mal écrit, je souuuuuuuuuuuuuffre tu imagines pas combien, et ça incite à se dire qu'un prog bien écrit, c'est pas que du scolaire et pour faire beau, c'est du tous les jours...

Pour finir : comme dit le proverbe chinois, celui qui pose une question est bête une fois, celui qui n'en pose pas est bête toute sa vie.


Message édité 1 fois, la dernière par bernie38 le 18 May 2006 - 19 h 51.

La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire


chamank


Messages : 7
Inscrit le 24/04/06
Non connecté
  Posté le 18 May 2006 - 20 h 30 m 09 s
ça c'est de l'explication! ça m'aide grandement.
En tout cas un grand merci pour l'aide et les explications (ça fonctionne nickel). Je crois que je vais faire comme tu me la conseillé: un bon livre de C.

Bon je le redis encore mais c'est gratuit :D un grand merci!




bernie38
Waldorf (le pote à Statler)

Messages : 11 452
Inscrit le 28/08/03
Ville : Claix
Non connecté
  Posté le 18 May 2006 - 20 h 43 m 42 s
pas de pb !
et tu sais, acheter un bouquin ça semble être comme écraser une mouche avec un marteau pilon, mais si tu veux faire du C un peu "industriellement", faut pas mégoter !

Bon courage, au début ça semble une grosse galère, et puis on est tout content d'arriver à des petits résultats, et ensuite à des trucs plus ambitieux.



La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire


Petit_PimoOosE
rsqrtps & pshufb

Messages : 4 617
Inscrit le 15/06/03
Ville : Montréal
Non connecté
  Posté le 19 May 2006 - 00 h 55 m 18 s
Juste une note en plus de Bernie (qui a été plus rapide que moi) : ne prends pas le premier bouquin de C qui te tombe sous la main. Le K&R est la première référence. C'est trop facile d'écrire (et d'acheter) un mauvais bouquin, que ce soit en C ou autre chose.

Et je n'ai peut-être pas tout suivi (le code n'est plus là !), mais je ne suis pas tout à fait d'accord sur un autre point : malloc() n'alloue pas un pointeur, il alloue un espace mémoire et retourne un pointeur vers le premier élément de celui-ci (ce qui ne change rien à la solution).



Huile de fraise.

bernie38
Waldorf (le pote à Statler)

Messages : 11 452
Inscrit le 28/08/03
Ville : Claix
Non connecté
  Posté le 19 May 2006 - 08 h 13 m 47 s
oui, pimoose, la précision est utile, malloc() alloue un espace mémoire et retourne, en cas de succès, le pointeur adressant cette zone.
Faire des raccourcis comme je l'ai fait peut-être confusant pour un débutant, faut que je fasse gaffe à l'avenir !!!



La Montagne n'est pas dangereuse : on ne peut qu'y perdre la vie, tandis qu'en ville on devient bête et méchant
Voltaire


chamank


Messages : 7
Inscrit le 24/04/06
Non connecté
  Posté le 19 May 2006 - 14 h 21 m 03 s

au début ça semble une grosse galère, et puis on est tout content d'arriver à des petits résultats, et ensuite à des trucs plus ambitieux.


C'est exactement ce qui vient de m'arriver, j'ai lutter mais maintenant c'est bon :yes:

Pour le malloc j'ai retenu la leçon :D c'est surtout que en fait mes profs nous ont toujours balancé un code sans vraiment l'expliquer, sans entrer dans les détails d'où la mauvaise utilisation de malloc.

Pour les livres de C faut que je fouine un peu dans les affaires de mon frère, c'est lui qui les planque :D mais ça devrait aller maintenant, j'ai la bonne habitude de chercher avant de demander (en particulier pour la prog)
Bref encore un grand merci et bonne continuation a vous!!



PS: J'ai remis le code pour ceux que ça intéresserai plus tard, je l'avais supprimé par erreur.




Page genérée en 0.2373 secondes par RahForum 2.0 | Gzip off |  Stats |  Metaforums |  RSS
© 2004 Cerbere Systems.
Prix Matériel Informatique | Informatique Lyon | Informatique Grenoble | Informatique Annecy | Informatique Marseille | Informatique Bordeaux | Forum Informatique
ADSL | Actualité ADSL | Deligo | Appareil photo | Commande Au Volant
Creative Commons
Message Boards and Forums Directory