malloc() ne retourne pas void, mais un pointeur générique que type (void *).
Thierry
Version imprimable
malloc() ne retourne pas void, mais un pointeur générique que type (void *).
Thierry
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 planteCode:
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 recv4Code:
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 :Citation:
// Indiquez l'adresse IP de votre serveur
Code:
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:packet = malloc(sizeof(struct packetRec));
2)Code:packet = malloc(sizeof * packet);
=>Code:
1
2 packet = malloc(sizeof(struct packetRec)); memset(packet, 0x0, sizeof(struct packetRec));
si tu avais respecté ça, ça t'aurais éviter ça :Code:packet = calloc(1, sizeof * packet);
j'ai pas besoin d'expliquer, je pense que tout le monde voit le problème...Code:
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:
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:
ThierryCode:
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 */ }
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).
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:
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 */ }