79 votes

déterminer la taille de la mémoire allouée dynamiquement en c

Existe-t-il un moyen de connaître la taille de la mémoire allouée dynamiquement dans c?
Par exemple, supposons que je dise
char* p = malloc(sizeof(char)*100);
Existe-t-il maintenant un moyen de connaître la taille de la mémoire associée à p?

66voto

ars Points 35803

Il n'y a pas moyen de trouver cette information. Cependant, certaines implémentations de fournir des fonctions comme msize pour ce faire. Par exemple:

Gardez à l'esprit cependant, que malloc va allouer un minimum de la taille demandée, de sorte que vous devriez vérifier si msize variante de mise en œuvre renvoie en fait à la taille de l'objet ou de la mémoire allouée sur le tas.

55voto

Alex Reynolds Points 45039

Liste des FAQ comp.lang.c · Question 7.27 -

Q. Puis-je alors interroger le paquet malloc pour savoir quelle est la taille d'un bloc alloué?

R. Malheureusement, il n'y a pas de moyen standard ou portable. (Certains compilateurs fournissent des extensions non standard.) Si vous avez besoin de savoir, vous devrez le garder vous-même. (Voir aussi la question 7.28 .)

15voto

Artelius Points 25772

Le C mentalité est de fournir au programmeur des outils pour l'aider dans son travail, de ne pas fournir des abstractions qui changent la nature de son travail. C essaie aussi d'éviter de rendre les choses plus facile/plus sûr si cela se fait au détriment de la limite de performance.

Certaines des choses que vous pourriez faire avec une région de la mémoire, seul l'emplacement du début de la région. Ces choses incluent le travail avec null cordes, de la manipulation de la première n octets de la région (si la région est connue pour être au moins ce grand), et ainsi de suite.

Fondamentalement, garder une trace de la longueur d'une région de l'est du travail supplémentaire, et si C fait automatiquement, il faudra parfois faire inutilement.

De nombreuses fonctions de la bibliothèque (par exemple, fread()) ont besoin d'un pointeur sur le début d'une région, et aussi de la taille de cette région. Si vous avez besoin de la taille d'une région, vous devez en garder la trace.

Oui, malloc() implémentations généralement de garder la trace d'une région de la taille, mais ils peuvent le faire indirectement, ou aller jusqu'à une certaine valeur, ou de ne pas le garder à tous les. Même s'ils prennent en charge, trouver la taille de cette façon, peut-être lent par rapport à garder une trace de vous-même.

Si vous avez besoin d'une structure de données qui sait comment big chaque région est, C peut le faire pour vous. Il suffit d'utiliser une structure qui conserve la trace de la taille de la région est ainsi qu'un pointeur vers la région.

10voto

Greg Hewgill Points 356191

Non, la bibliothèque d'exécution C ne fournit pas une telle fonction.

Certaines bibliothèques peuvent fournir des fonctions spécifiques à la plate-forme ou au compilateur pouvant obtenir ces informations, mais la manière de garder trace de ces informations consiste généralement à utiliser une autre variable entière.

0voto

H. Acker Points 11

Ce code fonctionnera probablement sur la plupart des installations Windows:

 template <class T>
int get_allocated_bytes(T* ptr)
{
 return *((int*)ptr-4);
}

template <class T>
int get_allocated_elements(T* ptr)
{
 return get_allocated_bytes(ptr)/sizeof(T);
}
 

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