L'obtention de la taille des données d'un Pointeur
J'ai essayé le code suivant afin de voir comment obtenir la taille des données d'un pointeur:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char *test_char_ptr = "This is just a test";
int *test_int_ptr = (int *) malloc(16*sizeof(int));
for(int i = 0; i<16; i++){
test_int_ptr[i] = i;
}
printf("%s\n",test_char_ptr);
printf("Test char 1: %d\n", (int)sizeof test_char_ptr );
printf("Test char 2:%d\n", (int)sizeof *test_char_ptr );
printf("Test char 3: %d\n", (int)((strlen(test_char_ptr)+1) * sizeof(char)));
printf("Test int 1:%d\n", (int)sizeof test_int_ptr );
printf("Test int 2:%d\n", (int)sizeof *test_int_ptr );
return EXIT_SUCCESS;
}
Et le code de sortie est(Sur 32 bits gcc 4.3):
This is just a test
Test char 1: 4
Test char 2:1
Test char 3: 20
Test int 1:4
Test int 2:4
Je pensais que sizeof(*test_char_ptr) me donnerait la sizeof les données à l'intérieur de l' *test_char_ptr. Mais au lieu de cela il m'a donné 1 , je pense que c'est le sizeof char à la place des données. La même chose est pour le test_int_ptr. Longue histoire courte, ma question est comment puis-je obtenir le sizeof données à l'intérieur d'un pointeur ou dynamiquement de la mémoire allouée tableau.
- Depuis votre modifier pour changer les strlen() de la ligne, je pense que la sortie ne correspondent plus.
- Ok j'ai mis à jour la sortie.
- double possible de Comment trouver le sizeof(un pointeur pointant sur un tableau)
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas quelque chose que vous pouvez faire en C sans conserver les informations vous-même. Vous avez créé des tableaux, vous saviez donc leur taille à un moment donné, vous avez juste à garder une trace de celui-ci sur votre propre. Vous pouvez créer une structure de données pour vous aider, ou simplement mettre à jour le tableau et les informations de taille soigneusement, sans aucune structure de données à tous.
En outre, votre code à l'aide de
strlen()
pour obtenir la taille de la chaîne - assurez-vous que vous vous souvenez que la taille retournée ne sera pas inclure le caractère de fin null ('\0'
); la taille en mémoire d'une constante de chaîne eststrlen(string) + 1
.CreateDIBSection
et que fait-il faire avec cette question?Le pointeur ne pas garder une trace du nombre d'objets sont alloués derrière la (première) une il souligne. C'est parce qu'il ne peut pas:
malloc()
retourne l'adresse du premier élément, rien d'autre.À cet effet il n'y a aucun moyen de savoir la taille d'un tableau alloué dynamiquement. Vous devez garder une trace de vous-même.
sizeof
ne connaît que la taille totale de la matrice si c'est de manière statique connu au moment de la compilation. Pour un pointeur, il sera de retour de la taille de l'adresse de mémoire, c'est à dire 4 sur 32 bits, 8 64 bits.Lorsque vous utilisez les pointeurs, c'est à vous de savoir et de garder trace de la taille des données qu'il a points de. La langue mise en œuvre ne va pas le faire pour vous comme il le ferait pour les tableaux.
Il n'existe pas de méthode standard pour ce faire. Vous avez à garder de la longueur de la mémoire allouée dans une autre variable, ou à l'utilisation d'un "container" qui assure le suivi pour vous.
Certaines plates-formes ont des fonctions pour trouver le nombre d'octets dans une allocation, par exemple, Symbian comme un
AllocSize(ptr)
fonction.Un pointeur seuls points où les données commence. Il ne sait rien à propos de la taille des données.