3 votes

Malloc dans une boucle, tous les blocs alloués sont-ils consécutifs ?

J'ai une fonction dans laquelle j'utilise un tableau local. J'aimerais renvoyer un pointeur sur ce tableau, mais il est évidemment impossible de le faire à moins d'allouer manuellement de la mémoire. J'aimerais donc savoir si l'allocation est possible :

for(i = 0; i < 26; i++)
{
    llist[i] = malloc(sizeof(SomeStruct));
}

peut être libéré ultérieurement de la manière suivante :

// (where ptr is a pointer to the first allocation in llist)

for(i = 0; i < 26, i++)
{
    free(ptr);
    ptr += sizeof(SomeStruct);
}

Editer :

Il semble que je ne puisse pas le faire. Existe-t-il un moyen de libérer toute la mémoire en ne disposant que d'un pointeur sur le premier élément ? Ou dois-je adopter une approche totalement différente ?

5voto

Dark Falcon Points 15609

Non, il ne peut pas. Il n'y a aucune garantie que ces blocs soient alloués consécutivement. En fait, il est presque certain qu'ils ne le sont pas avec toutes les implémentations modernes que j'ai vues. La plupart d'entre elles stockent la taille du bloc et souvent d'autres informations immédiatement avant chaque bloc. De plus, si votre mémoire est fragmentée, les blocs peuvent se retrouver n'importe où dans l'espace libre entre d'autres données, où il n'y a pas assez de place pour les placer consécutivement.

2voto

Anders Abel Points 36203

Non, vous ne pouvez pas. Dans le premier espace vide malloc trouve qu'il n'y a peut-être de place que pour une structure. Si c'est le cas, le bloc suivant sera placé ailleurs.

0voto

Marc B Points 195501

Cela dépend de ce que vous faites à l'intérieur de la boucle. Certaines fonctions allouent des tampons en interne, ce qui signifie que malloc() peut être appelé dans votre dos. Dans votre boucle simple, les valeurs DEVRAIENT être consécutives. De plus, dès que vous ajoutez le multithreading, tous les paris sont ouverts, car quelque chose dans un autre thread pourrait également utiliser malloc() pour allouer de la mémoire.

Le point d'allocation réel dépend également de la fragmentation de votre mémoire. Il se peut qu'il n'y ait pas assez de blocs consécutifs pour répondre à votre demande, de sorte que l'allocation réelle peut se faire n'importe où dans l'espace libre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X