Non, il n'y a aucun moyen d'obtenir cette information sans dépendre fortement sur les détails de mise en œuvre de l' malloc
. En particulier, malloc
peut allouer plus d'octets que vous demandez (par exemple, pour plus d'efficacité dans une architecture de mémoire). Il serait beaucoup mieux de revoir votre code afin que vous garder une trace de l' n
explicitement. L'alternative est au moins autant la refonte et bien plus dangereux de l'approche (étant donné qu'il est non-standard, les abus de la sémantique des pointeurs, et aura un entretien cauchemar pour ceux qui viennent après vous): stocker la longueurn
à la malloc avais l'adresse, le suivi du tableau. L'Allocation serait alors:
void *p = calloc(sizeof(struct mystruct) * n + sizeof(unsigned long int),1));
*((unsigned long int*)p) = n;
n
est actuellement stocké en *((unsigned long int*)p)
et le début de votre tableau est maintenant
void *arr = p+sizeof(unsigned long int);
Edit: Juste pour jouer l'avocat du diable... je sais que ces "solutions" toutes nécessitent des remaniements, mais nous allons jouer dehors.
Bien sûr, la solution présentée ci-dessus est juste un hacky mise en œuvre d'une (bien emballé) struct. Vous pouvez ainsi définir:
typedef struct {
unsigned int n;
void *arr;
} arrInfo;
et de faire passer arrInfo
s plutôt que brut de pointeurs.
Maintenant, nous faisons la cuisine. Mais aussi longtemps que vous êtes la refonte, pourquoi s'arrêter là? Ce que vous voulez vraiment est un type abstrait de données (ADT). Tout texte d'introduction à l'un des algorithmes et structures de données de la classe. Un ADT définit l'interface publique d'un type de données, mais cache la mise en œuvre de ce type de données. Ainsi, publiquement un ADT pour un tableau pourrait ressembler
typedef void* arrayInfo;
(arrayInfo)newArrayInfo(unsignd int n, unsigned int itemSize);
(void)deleteArrayInfo(arrayInfo);
(unsigned int)arrayLength(arrayInfo);
(void*)arrayPtr(arrayInfo);
...
En d'autres termes, l'ADT est une forme de données et le comportement de l'encapsulation... en d'autres mots, il est à peu près aussi proche que vous pouvez obtenir à la Programmation Orientée Objet à l'aide de droites C. Sauf si vous êtes coincé sur une plate-forme qui n'est pas un compilateur C++, vous pourriez aussi bien aller ensemble de porcs et d'utiliser la STL std::vector
.
Là, nous avons pris une simple question à propos de C et a terminé au C++. Que dieu nous aide tous.