Organisation de la mémoire

KurpeusLondon Messages postés 11 Date d'inscription lundi 5 janvier 2009 Statut Membre Dernière intervention 12 janvier 2009 - 7 janv. 2009 à 17:13
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 7 janv. 2009 à 19:38
Désolé une petite question de plus pour la forme:)

Je comprends pas comment est organisé la mémoire lors d'un malloc et compagnie : je m'explique.

J'ai crée une structure qui contient exclusivement des pointeurs vers une sous structure; cette super structure est nommée sTop :

struct sTop{
    struct sData * u12Main;
    struct sData * u23Main;
    struct sData * u31Main;
    struct sData * v1Main;
    struct sData * v2Main;
    struct sData * v3Main;
    struct sData * freqMain;
    struct sData * u12Gen;
    struct sData * u23Gen;
    struct sData * u31Gen;
    struct sData * v1Gen;
    struct sData * v2Gen;
    struct sData * v3Gen;
    struct sData * freqGen;
};

J'alloue de la mémoire a cette structure comme suit :

struct sTop * pTop = (struct sTop * ) malloc (sizeof (struct sTop ));

Lorsque j'utilise printf pour savoir la taille de ma structure, Il me renvoit 56 ce qui corresponds à 4*14 , mon nombre de pointeurs de 4 bytes. Jusque la rien d'anormale

J'ai un pointeur pNextStruct que j'ai initialisé au début de ma structure :
struct sData * pNextStruct = NULL;

pNextStruct = pTop;

Mais voila le problem, quand j'essaye de parcourir les éléments de ma super structure, moi pointeur fait des pas trop grand :

pNextStruct++;

Il passe de 0x00343440 à 0x00343454 alors que pour moi il aurait du aller à 0x00343444.

Pour info voici la soustructure auquel les pointeurs de ma superStructure pointent.

struct sData{
    char * label;
    char * value;
    char frame[9];
}
struct sData * pSubStruct = (struct sData*) malloc( sizeof(struct sData ));

Ce pointeur pSubStruct est retourné par un fonction et chaque pointeur de ma super Structure récupere l'adresse pointée de celui ci.

Merci bien.

3 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 janv. 2009 à 18:37
Normal que passe de 0x00343440 à 0x00343454, donc 20 octets.

struct sData{
    char * label;
    char * value;
    char frame[9];
}
c'est bien la taille de cette structure, le compilo l'ayant traduit correctement en:
struct sData{
    char * label;
    char * value;
    char frame[12];
}
pour que tes pointeurs soient bien alignés sur 4.

ciao...
BruNews, MVP VC++
0
KurpeusLondon Messages postés 11 Date d'inscription lundi 5 janvier 2009 Statut Membre Dernière intervention 12 janvier 2009
7 janv. 2009 à 19:01
Ca veut dire qu'il prends en compte la taille de l'objet pointé ? Ok pour ça, c'est bon a savoir

Pourquoi alors ma structure sTop qui ne comprends que des pointeurs non initialisés s'étant sur 54 bytes c'est a dire quelque part en mémoire des pointeurs de 4 bytes qui se suivent à la queue leu leu (tiens je sais pas comment on écrit ça :p ?!? ) et quand je lui demande de faire une opération sur un même pointeur il prend en compte la structure pointé ?

Ais je quelque chose a faire avec le malloc de ma super structure ?
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
7 janv. 2009 à 19:38
56 bytes, normal aussi : 14 * 4 = 56.
Ils sont tous bien alignés sur 4.

Initialisés ou non n'entre pour rien dans l'affaire, chaque pointeur de la structure a sa place réservée l'un derrière l'autre en mémoire, quelle que soit la valeur (adresse mémoire) qui s'y trouve.

ciao...
BruNews, MVP VC++
0
Rejoignez-nous