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?
Réponses
Trop de publicités?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:
- _msize sur Windows
- malloc_size sur MacOS
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.
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 .)
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.
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.