Obtenir la taille d’un malloc uniquement avec le pointeur renvoyé

Je veux pouvoir varier la taille de mon tableau afin d’en créer un de cette façon:

int* array; array = malloc(sizeof(int)*10);//10 integer elements 

Je peux utiliser ceci comme un tableau comme vous le feriez normalement, cependant, lorsque j’essaie de trouver la taille de celui-ci,

 size = sizeof(array)/sizeof(int); 

Je reçois la réponse 1 parce que ce n’est pas le reconnaître comme pointant vers un tableau

Comment puis-je obtenir la taille du tableau? (Je sais que ce n’est pas techniquement un tableau, mais existe-t-il un moyen de calculer la taille totale du bloc de mémoire alloué?)

Aussi ai-je raison de supposer ce que j’ai dit dans la description? Si je me trompe techniquement à propos de quelque chose, corrigez-moi.

Le pointeur est un pointeur et non un tableau. Il ne peut jamais être “reconnu comme un tableau”, car ce n’est pas un tableau .

C’est entièrement à vous de vous rappeler la taille du tableau.

Par exemple:

 struct i_must_remember_the_size { size_t len; int * arr; }; struct i_must_remember_the_size a = { 10, NULL }; a.arr = malloc(a.len * sizeof *a.arr); 

Il n’y a pas de moyen standard de faire ce que vous demandez. Certains compilateurs peuvent fournir une fonction pour cela, ou d’autres allocateurs peuvent avoir une telle fonction, mais, comme déjà dit, il n’y a rien de standard.

Notez que la sizeof appliquée aux tableaux ne fonctionne pas car elle reconnaît le pointeur “comme dans un tableau”: elle reconnaît simplement son argument sous forme de tableau ( sizeof est l’un des rares contextes dans lesquels un tableau ne se décompose pas en premier élément); une fois que votre tableau se désintègre en un pointeur sizeof ne produira que la taille du pointeur.

Tout d’abord, sizeof () renvoie la taille d’un “type”; il ne sait rien de la mémoire allouée.

Deuxièmement, il n’existe aucun moyen d’obtenir la taille d’un bloc malloc (), SAUF si vous souhaitez creuser dans les éléments internes de la bibliothèque d’exécution de votre compilateur. Ce qui n’est certainement pas une bonne idée, d’autant plus qu’il n’ya aucun problème à mémoriser la taille ailleurs — vous pouvez préfixer le bloc de mémoire avec un autre élément pour stocker la taille, ou le stocker séparément.

En C standard et portable, c’est impossible. Notez que certains compilateurs fournissent des extensions non standard (gardez-en une trace, par exemple msize ).

De plus, l’opérateur sizeof ne peut pas vous dire la taille du bloc, il donne donc la taille du pointeur (rappelez-vous que sizeof fonctionne au moment de la compilation, sauf avec des tableaux de longueur variable).

Vous devez donc conserver la taille allouée, par exemple dans une structure de données telle que:

 #include  typedef struct { int *p; size_t n; } array; 

Utilisez un type pointeur vers tableau plutôt qu’un type pointeur vers élément:

 int (*parray)[10] = malloc(sizeof *parray); 

Ensuite, sizeof *parray vous donne la réponse souhaitée, mais vous devez accéder au tableau à l’aide de l’opérateur * , comme dans (*parray)[i] (ou de façon tout aussi déroutante, parray[0][i] ). Notez que dans C moderne, 10 peut être remplacé par une variable.