Malloc de structures

Résolu
lektrosonic Messages postés 145 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 21 février 2013 - 6 déc. 2007 à 13:41
nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 - 8 déc. 2007 à 00:42
Voici ma structure:

typedef struct _user
{
 
    int index;
    int t_index;
    BOOL connected;
    char ip[32];
    BOOL p_protected;
    char u_name[32];
    struct _user *next;
 
} user;
 
typedef user* llist;

Quand je fait un malloc(sizeof(user)), mon programme plante: fenetre envoye ne pas envoye.
(je sais que c est le malloc qui le plante car quand je le met en commentaire, mon porgrame ne plante pas)

Une idee ?

Merci d'avance

l3KTr0 Was HeRe

18 réponses

Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
7 déc. 2007 à 19:18
Aucune idée (peut etre ton code), mais de tt facon ya aucune utilité d'utiliser malloc si ton prog doit tourner exclusivement sous windows, utilise plutot
HeapAlloc: http://msdn2.microsoft.com/en-us/library/aa366597.aspx
ou VirtualAlloc: http://msdn2.microsoft.com/en-us/library/aa366887.aspx

Neo_Fr
3
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
6 déc. 2007 à 15:18
Salut,
Pas de souci chez moi.
Montres-nous ton appel pour voir, et l'utilisation que tu fais de ta structure.

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
0
lektrosonic Messages postés 145 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 21 février 2013
6 déc. 2007 à 15:43
l'appel est ceci, dans cette fonction

llist add_user(llist linked_user,int indx,int t_indx,char* ipad,char* nam,BOOL prtcd,BOOL cnntd)
{
    auto llist new_user;
    new_user=malloc(sizeof(user));
    //memset((*new_user).ip,0,32);
    //memset((*new_user).u_name,0,32);
    //(*new_user).index=indx;
    //(*new_user).t_index=t_indx;
    //(*new_user).connected=cnntd;
    //strcpy((*new_user).ip,ipad);
    //(*new_user).p_protected=prtcd;
    //strcpy((*new_user).u_name,nam);
    //(*new_user).next=linked_user;
    //return new_user;
}

l3KTr0 Was HeRe
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
6 déc. 2007 à 16:06
Re,
Aucun souci...si ce n'est qu'il faut caster la sortie de malloc, comme suit:
new_user=(user *)malloc(sizeof(user));

Ptet un souci lors de l'affectation du pointeur next...
A part ça, je ne vois pas, désolé...

Nb: à quoi sert le mot clé "auto"? Je ne connais pas...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lektrosonic Messages postés 145 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 21 février 2013
6 déc. 2007 à 16:10
 
Avec la casting ca ne marhe toujours pas..
auto cst une vielle habitude que j'ai pri, en C89, uen variable auto va etre detruite apres l execution de la fonction

merci en tt cas pour ton aide
l3KTr0 Was HeRe
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
6 déc. 2007 à 16:19
As-tu exécuter ton code pas-à-pas en débug? Sais-tu où ton appli plante?

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
0
lektrosonic Messages postés 145 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 21 février 2013
6 déc. 2007 à 16:21
Oui j'ai execute pas a pas.
je sais que c est le malloc qui le plante car quand je le met en commentaire, mon porgrame ne plante pas
Quand je le compile en debug et que je lance a partir de visual sa marche, si je compile en dbug ou en release, et que je le lance a partir de windows sa plante au moment de l'apele du malloc

l3KTr0 Was HeRe
0
wissemc Messages postés 2 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 4 avril 2008
6 déc. 2007 à 21:54
definition de structure:
exemple


struct nom_structure


{ int abc;
char nom[20];
} typedef struct nom_structure nouveau_nom;

pour reserver un zone mémoire en utilise la fonction malloc de la bibliotèque include<malloc.h>ou<stdlib.h>
donc la reservation est la suivant:
p=malloc(sizeof(nouveau_structure));
avec sizreof est une fonction qui renvoi la taille de structure en octé
et p un pointeur
0
nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
7 déc. 2007 à 13:08
Salut,

wissemc--> tu as dit tout vrai.
lektrosonic--> voici un truc que tu pourrais essayer, si ca plante je me defais du C pour de bon lol:

#include <malloc.h>
#include <string.h>

typedef struct _user
{
    char connected;
    char p_protected;
    int index;
    int t_index;
    struct _user *next;
    char ip[32];
    char u_name[32];
} user,*llist;

llist add_user(llist linked_user,int indx,int t_indx,char* ipad,char* nam,char prtcd, char cnntd)
{
    llist new_user = (llist)malloc(sizeof(user));
    if(!new_user)return 0; //des fois que l'allocation echouerait

    memset((*new_user).ip,0,32);
    memset((*new_user).u_name,0,32);
    (*new_user).index=indx;
    (*new_user).t_index=t_indx;
    (*new_user).connected=cnntd;
    if(ipad)strcpy((*new_user).ip,ipad);
    (*new_user).p_protected=prtcd;
    if(nam)strcpy((*new_user).u_name,nam);
    (*new_user).next=linked_user;
    return new_user;
}

J'espere avoir aide, Bonne chance

je suis heureux de faire partie d'une grande famille ...!
0
lektrosonic Messages postés 145 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 21 février 2013
7 déc. 2007 à 14:12
lol ben mauvaise nouvele pour toi et moi..lol
ton code ne marche, c est toujours le malloc qui foire (je l'ai mi en commentaire et ca ne plante pas)
je suis desesperee............

l3KTr0 Was HeRe
0
Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
7 déc. 2007 à 17:40
Si ton code est destiné a tourner sous windows essaye ca:

typedef struct _user
{
int index;
int t_index;
BOOL connected;
char ip[32];
BOOL p_protected;
char u_name[32];
LPUSER next;
}USER, *LPUSER;

LPUSER add_user(LPUSER linked_user, int indx, int t_indx, char* ipad, char* nam, char prtcd, char cnntd)
{
LPUSER new_user;
new_user = (LPUSER) HeapAlloc(GetProcessHeap(), (HEAP_NO_SERIALIZE|HEAP_ZERO_MEMORY), sizeof(USER));
if(!new_user) return 0; //des fois que l'allocation echouerait

new_user->index = indx;
new_user->t_index = t_indx;
new_user->connected = cnntd;
if(ipad) strcpy(new_user->ip, ipad);
new_user->p_protected = prtcd;
if(nam) strcpy(new_user->u_name, nam);
new_user->next = linked_user;
return new_user;
}

Neo_Fr
0
lektrosonic Messages postés 145 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 21 février 2013
7 déc. 2007 à 19:06
Neo_Fr je te remercie, sa a marche, par contre, as tu une idee pourquoi sa plantait avec malloc ?
l3KTr0 Was HeRe
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
7 déc. 2007 à 21:31
[auteur/LEKTROSONIC/352224.aspx lektrosonic] >> As tu fais un copier coller du code de neo ou à tu simplement remplacés malloc par HeapAlloc ?

C++ (@++)<!--
0
lektrosonic Messages postés 145 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 21 février 2013
7 déc. 2007 à 21:36
Nan juste remplace.

l3KTr0 Was HeRe
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
7 déc. 2007 à 21:39
Même pas changé le nom de la structure ?

C++ (@++)<!--
0
lektrosonic Messages postés 145 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 21 février 2013
7 déc. 2007 à 21:41
Non pk ?

l3KTr0 Was HeRe
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
7 déc. 2007 à 21:46
Zut.
Parce que sinon, ça aurait pu expliquer (ou mener vers) l'erreur mais là j'en sais vraiment rien. Trop bizarre ton truc.

C++ (@++)<!--
0
nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
8 déc. 2007 à 00:42
Salut lektrosonic,

si mon code ne marche sur ta machine la seule explication que je peux avoir est kil te manque certaines dll. par exemple en mode debug visual c++ 6.0 utilise mfc42d.dll (note le d apres le nom), pour des appications mfc. Ca m'est deja arrive plusieurs fois, et surtout lorsque tu utilise une version Introduction (donc limitee).Lorsque le programme(Visual Studio) lui meme est corrompu et que certaines DLL sont absentes ou elles meme corrompues plus rien ne fonctionne :il compile et link mais une erreur survient a l'execution.

je suis vraiment surpris que ce code , ki est la base d'une allocation dynamique de bloc (cours C/C++) ne marche pas , car ton code - potentiellement- etait absolument correct. PArce que sous linux ya pas de virtualalloc ou heapalloc. Si kkun est gre de nous eclairer la dessus, ce sera avec grand plaisir.

je suis heureux de faire partie d'une grande famille ...!
0
Rejoignez-nous