Après avoir commencé à étudier Ulrich Dreppers « Ce que tout programmeur doit savoir sur la mémoire » série [1] Je suis resté bloqué en essayant de reproduire les exemples présentés dans la sectionStructs sur la pile (ANSI C)
3.3.2 Mesures Pour autant que je sache, les structures doivent être allouées sur la pile puisqu'elles sont en mémoire les unes après les autres. Vérification de cela avec un petit programme:
#include <stdio.h>
#include <stdlib.h>
#define NUMPAD 0
struct listelement
{
struct listelement *next;
long int padding[NUMPAD];
};
typedef struct listelement elem;
int main()
{
int size_elem = sizeof(elem);
printf("Size of a list elem: %i\n", size_elem);
elem _1, _2, _3;
_1.next = &_2;
_2.next = &_3;
_3.next = &_1;
elem *first, *last, *curr;
first = &_1;
last = &_3;
curr = &_1;
int k=0;
while(1)
{
printf("Element at %p", curr);
for (int i=0; i<NUMPAD; i++)
{
(curr->padding)[i] = i+k;
printf("%ld ", (curr->padding)[i]);
}
printf("\n");
if (curr == last)
break;
k++;
curr = curr->next;
}
return 0;
}
Lors de l'exécution du programme est la sortie:
Size of a list elem: 8
Element at 0x7fff5fbff540
Element at 0x7fff5fbff530
Element at 0x7fff5fbff520
Les différences entre les adresses de mémoire, est cependant 16 pourquoi pas 8? En augmentant NUMPAD la différence semble croître encore plus, par exemple pour NUMPAD = 2 j'obtiens une différence de 511.
J'ai fait les tests sur un macbook pro fonctionnant sous OSX 10.6 64bit.
[1] http://lwn.net/Articles/252125/
Mise à jour: Je joue aussi avec incrémenter/décrémenter les pointeurs. Il semble fonctionner en mode 32 bits, mais pas en mode 64 bits. Ajouter le code
first--;
printf("first-- %p\n", first);
if (first == &_2) {
printf("Decrementing works.\n");
}
macbook:blah nils$ gcc -m32 -DNUMPAD=0 -g -std=c99 -o blah blah.c && ./blah
Size of a list elem: 4
Element at 0xbffff5b8
Element at 0xbffff5b4
Element at 0xbffff5b0
first-- 0xbffff5b4
Decrementing works.
macbook:blah nils$ gcc -DNUMPAD=0 -g -std=c99 -o blah blah.c && ./blah
Size of a list elem: 8
Element at 0x7fff5fbff530
Element at 0x7fff5fbff520
Element at 0x7fff5fbff510
first-- 0x7fff5fbff528
Je me demande comment cela a du sens ... peut-être que je devrais simplement placer tous les structs dans un tableau.
Essayez de compiler avec des erreurs -pedantic. C'est un code C standard invalide ... Vous pouvez avoir array [] dans struct/union. Mais pas de tableau d'éléments 0. – Nyan
Je sais, mais cela ne semble pas être le problème – Nils
Oui, vous devriez certainement placer les structures dans un tableau si vous avez des attentes qu'ils seront adjacents. Notez que l'article Dreppers lui-même dit "Le programme * crée un tableau * correspondant à la taille de l'ensemble de travail des éléments de ce type" –