Allocation de mémoire a une structure [Résolu]

Signaler
Messages postés
11
Date d'inscription
lundi 5 janvier 2009
Statut
Membre
Dernière intervention
12 janvier 2009
-
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
-
Bonjour,

J'essaye d'initialiser des structures par un appel de fonction qui retourne l'adresse mémoire de la structure fraichement crée. Lorsque je compile, l'execution crash m'indiquant que j'essaye d'écrire à l'adresse mémoire 0x0000000000.  voici le code :

=====================================================
Déclatation
=====================================================
struct sData{          // structure globale
    char label[16];
    unsigned int value;
    unsigned int slaveAddr; /* Modbus communication use addr "0" to broadcast and 1 to 247 to address a node. 248 to 255 are reserved addresses. To be convert in Hex */
                  /* According to the ATI100 transfer panel, broadcast adresse only usable for writing functions (6 and 16). */
    unsigned int functCode;
    unsigned int addr;
    unsigned int data;
    unsigned int crc16;/* ModBus define two function to compute the CRC : RTU and ASCII. ATI100 use RTU */
};
*
char * label = NULL; // variable déclarée dans le main puis initialiser
label = tableLabel[idReq]; // Un tableau à deux dimensions qui contient des chaines de caractères

struct sData * createStruct(unsigned int code, char * label){
    struct sData * pSubStruct = (struct sData*) malloc( sizeof(struct sData*));
    pSubStruct->label = label;
    pSubStruct->addr = code;
    pSubStruct->slaveAddr = 0x05;
    pSubStruct->functCode = 0x03;
    pSubStruct->data = 0x02;
    pSubStruct->crc16 = NULL;
    return &pSubStruct;
};

Dans la fonction createStruct( ) je peux vérifier que le contenu de label pointe bien sur la la case de mon tableau. Cependant je n'arrive pas a faire rentrer mon label dans ma structure. je dois dire que j'ai du mal a comprendre les déréférencements et valeurs pointées lorsque qu'il s'agit de structure

Merci

2 réponses

Messages postés
276
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
15 avril 2013
2
Remplace malloc( sizeof(struct sData *)); par  malloc( sizeof(struct sData)); 
et return &pSubStruct; par return pSubStruct;
Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
"pSubStruct->label = label;"
Pour copier une chaine dans une autre tu doit utiliser strcpy

En resumant ca donne ca:

typedef struct _sdata
{
char label[16];
UINT value;
UINT slaveAddr;
UINT functCode;
UINT addr;
UINT data;
UINT crc16;
}SDATA, *LPSDATA;

LPSDATA __stdcall CreateStruct(DWORD dwCode, LPSTR lpszLabel)
{
LPSDATA lpsData = (LPSDATA) HeapAlloc(GetProcessHeap(), 0, sizeof(SDATA));
if(!lpsData) return 0;
strcpy(lpsData->label, label);
lpsData->addr = dwCode;
lpsData->slaveAddr = 0x05;
lpsData->functCode = 0x03;
lpsData->data = 0x02;
lpsData->crc16 = NULL;
return lpsData;
}

Neo_Fr