malloc() ne retourne pas void, mais un pointeur générique que type (void *).
Thierry
malloc() ne retourne pas void, mais un pointeur générique que type (void *).
Thierry
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Bah le projet final est destiné a faire une DLL ... Donc le code ne serait pas dispo ...
Je vais essayé un maximum de degrossir les variables globales ... Mais bon certaines sont quand meme bien placé genre les step et erreur ... mais merci du conseil ... Je ne savais pas que c'était si mauvais que ca ...
Bon voila, je viens de tester le retour du malloc ... et il ne vaut pas NULL ... Donc c'est qu'il fait bien l'allocation ... Donc je ne comprend pas pourquoi il ne free pas ... Enfin qu'il me met une erreur de segmentation ... :'(
si tu as une erreur de segmentation à cet endroit c'est que packet->data n'est pas une adresse valide.
Après je sais pas pourquoi.
Hum... Ok ... Lol ... Bah ... Hum ... Saleté de comportement non comprehensible![]()
tu peux déjà mettre un printf avant et après chaque free dans
pour savoir lequel des deux plante
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 free(packet->data); packet->data = NULL; free(packet); packet = NULL;
C'est ce que j'ai fais ... Il ne va pas plus loin que le premier celui du dessus
Il n'affiche que le recv4
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 printf("recv4\n"); //Liberation de la mémoire. free(packet->data); printf("recv5\n"); packet->data = NULL; printf("recv6\n"); free(packet); packet = NULL; printf("recv7\n");
Quand tu dis :
Quel type de serveur? que fait ce programme? moi la seule erreur que j'obtiens c'est :// Indiquez l'adresse IP de votre serveur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Erreur connexion fonction connect() Erreur connexion fonction connect()
en meme temps si tu modifies le code sans le dire (par rapport a ton premier message.. ) !!
pourquoi avoir ajouté une * devant packet->data?
Le serveur est un automate ... Et le "progamme" est censé échanger des informations avec le serveur ... Il est normale que tu obtienne une erreur puisque tu n'es pas connecté au serveur ... Mais ce probleme a été résolu ... J'avais oublié de relancer mon interface réseaux (pas l'habitude sous linux)
Et donc il affichais cette erreur parce qu'il ne savait pas contacter l'host puisque je n'étais pas sur le réseaux ... Mais now ca fonctionne ... Et j'échange bien une information ... Mais il plante au free (Je sais que j'échange une info, puisque dans mon log, je vois le paquet qui a été envoyé et celui qui a été recu)
Erreur de manipulation .. Il n'y a plus détoile devant le packet->data ... Je pensais que comme c'était un pointeur vers un pointeur, une étoile aurait peut etre été necessaire ... Mais j'ai remarqué que non et donc j'ai remis comme au debut packet->data et j'ai edité mon post :$
... Et excuse moi d'avoir mis des printf sans le spécifié :'( ...
Ok alors je te donne ton erreur :
1)=>
Code : Sélectionner tout - Visualiser dans une fenêtre à part packet = malloc(sizeof(struct packetRec));2)
Code : Sélectionner tout - Visualiser dans une fenêtre à part packet = malloc(sizeof * packet);=>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 packet = malloc(sizeof(struct packetRec)); memset(packet, 0x0, sizeof(struct packetRec));si tu avais respecté ça, ça t'aurais éviter ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part packet = calloc(1, sizeof * packet);
j'ai pas besoin d'expliquer, je pense que tout le monde voit le problème...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 packet = malloc(sizeof(struct packetRec)); packet->data = malloc(nbCaractere-6); // Mise à zero. memset(packet, 0x0, sizeof(struct packetRec)); memcpy((void*)packet, (const void*)recbuf, nbCaractere);
tu ne vois pas le problème là?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 packet = malloc(sizeof(struct packetRec)); packet->data = malloc(nbCaractere-6); // Mise à zero. memset(packet, 0x0, sizeof(struct packetRec)); memcpy((void*)packet, (const void*)recbuf, nbCaractere);
tu initialises le champ data et puis tu le redéfinis quand tu fais ton memset, donc d'une part ça te fait une fuite de mémoire, d'autre part tu fais un free() sur un pointeur dont l'adresse est 0x00000000.
Ensuite je ne suis pas sûr du comportement de ton memcpy, mais je n'ai pas poussé plus loin.
Les deux initialisations se valent et ne sont pas très portables. Je préfère:
Thierry
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 packet = malloc(sizeof *packet); if (packet != NULL) { static struct packetRec const tmp = {0}; *packet = tmp; /* Suite du code */ } else { /* Action en cas d'ecec de l'allocation */ }
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Ha ui ... Il va mettre des 0x0 a tout les elements de la structure ... Et comme data est déclaré comme un pointeur, on donne une adresse au pointeur de 0x0 ... Je pense avoir compris ... Mais pourquoi cela fonctionne t'il sous windows ? et pas sous linux ?
Hum ... Bon maintenant il s'agit de regler le probleme...
Mais aussi ... Avec le memset ... Si je ne peux pas le faire parce que je donne une addresse 0x0 a data ... Comment faire ?
Portables, elles le sont, elles font bien ce qu'elles doivent faire, allouer un espace et mettre des 0 partout, maintenant je n'ai pas dis que c'est ce que le PO voulait, je pense qu'il voulait mettre des valeurs par défaut auquel cas effectivement, ça n'est pas la bonne méthode, à ce sujet la tienne est excellente. ça n'empêche qu'il y a un gros problème avec cette portion de code.
Correction, elles ne sont portables que sur une architecture ou zéro est toujours représenté par "all bits to zero", quel que soit le type de la variable (ce qui inclut le x86, à ma connaissance).
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Mais le probleme avec vos déclaration, c'est qu'il ne va pas generer un espace mémoire pour le pointeur data qui se trouve dans la structure ... Mais uniquement pour la structure elle meme ... Enfin j'suis un peu perdu avec toute vos solutions :s
Excusez moi de mon newbisme![]()
et bien c'est simple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 packet = malloc(sizeof *packet); if (packet != NULL) { static struct packetRec const tmp = {0}; *packet = tmp; packet->data = malloc(nbCaractere-6); if (packet->data != NULL) { /* ton code ici */ } } else { /* Action en cas d'échec de l'allocation */ }
Partager