2010-11-27 6 views
0

Je rencontre un problème lors du remplissage des membres de la structure avec une référence d'adresse mais quand cela est fait en utilisant le membre lui-même alors c'est bien.structure de la population par adresse mémoire en C

avec la structure memmber

memcpy(&(AVPFieldStructureObj->resource_value),data_start,actual_data_length); 

avec mémoire Adresse

memcpy((&AVPFieldStructureObj+fieldOffset),data_start,actual_data_length); 

où actual_data_length est la taille de varibale et data_start est pointeur vers la mémoire tampon de données.

avec la mémoire de son donner de la valeur des déchets quand j'imprimer le terrain et après l'exécution de l'ensemble je reçois une erreur de segmentation, mais quand le débogage avec GDB le programme sorti normally.there était sans faute de segmentation

s'il vous plaît suggérer

Merci à l'avance

Cordialement, Soheb

Répondre

0

Je crois fieldOffset est le décalage en octets?

Si vous faites quelque chose comme:

Type* pointer = somewhere; 
pointer += 3; 

puis pointer est déplacé vers l'avant par 3*sizeof(Type) octets - donc 3 Type objets avant. Donc dans votre code, dans cette dernière variante, vous ne compensez pas l'adresse par fieldOffset octets, mais par fieldOffset*sizeof(AVPFieldStructureObj) octets.

Vous pouvez contourner ce problème en projetant temporairement le pointeur sur char*.

+0

Merci Kos, cela fonctionne, extrêmement désolé que j'ai raté cette logique ou concept, son fonctionnement bien maintenant ..... alors la syntaxe correcte est memcpy (((char *) AVPFieldStructureObj + fieldOffset), data_start, actual_data_length); –

+2

c99 prend en charge la macro offsetof() dans stddef.h Vous pouvez essayer votre code. –