2009-10-15 5 views
5

J'ai essayé le code suivant afin de voir comment obtenir la taille des données d'un pointeur:Lit 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 la sortie de code 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 donner les sizeof les données à l'intérieur de la * test_char_ptr. Mais au lieu de cela, il m'a donné 1, ce qui je pense que c'est le sizeof char au lieu des données. La même chose est pour le test_int_ptr. Longue histoire courte, ma question est de savoir comment puis-je obtenir les données sizeof dans un pointeur ou un tableau alloué dynamiquement de la mémoire.

+0

Depuis votre modification pour modifier la ligne strlen(), je pense que la sortie ne correspond plus. –

+0

Ok, j'ai mis à jour la sortie. – systemsfault

+0

duplicata possible de [Comment trouver le sizeof (un pointeur pointant vers un tableau)] (http://stackoverflow.com/questions/492384/how-to-find-the-sizeofa-pointer-pointing-to-an- array) – outis

Répondre

13

Ce n'est pas quelque chose que vous pouvez faire en C sans conserver vous-même les informations. Vous avez créé les tableaux, de sorte que vous connaissiez leur taille à un moment donné, il vous suffit de les suivre par vous-même. Vous pouvez créer une structure de données pour vous aider, ou simplement gérer les informations de tableau et de taille avec précaution, sans aucune structure de données.

En outre, votre code utilise strlen() pour obtenir la taille de la chaîne - assurez-vous que la taille renvoyée n'inclura pas le caractère nul final ('\0'); la taille en mémoire d'une constante de chaîne est strlen(string) + 1.

+0

C'était un code de test rapide et sale: D. Donc, c'est juste une faute de frappe. – systemsfault

+0

Vous devriez pouvoir éditer votre message et le nettoyer ensuite; Je vais modifier ma réponse de manière appropriée si/quand cela arrive. –

+0

Il n'a pas besoin d'être qu'il a alloué de la mémoire. Certaines fonctions renvoient la mémoire allouée et d'autres sous-systèmes la libèrent/la modifient. CreateDIBSection est un exemple. –

5

sizeof ne connaît la taille complète de la matrice que si elle est connue statiquement au moment de la compilation. Pour un pointeur, il retournera la taille de l'adresse de mémoire, c'est-à-dire 4 sur 32 bits, 8 sur 64 bits. Lorsque vous utilisez des pointeurs, c'est à vous de connaître et de suivre la taille des données vers lesquelles ils pointent. L'implémentation du langage ne le fera pas pour vous comme pour les tableaux.

+0

Je crois que vous avez mal interprété ma déclaration, ou je ne l'ai pas déclaré clairement. sizeof (* p) peut être 1, mais sizeof (p) est identique à sizeof (void *) – asveikau

+0

@asveikau: Je peux maintenant voir que je vous ai mal interprété. Pardon. – sbi

3

Il n'existe aucun moyen standard pour ce faire. Vous devez conserver la longueur de la mémoire allouée dans une autre variable, ou utiliser un 'conteneur' qui garde la trace pour vous.

Certaines plates-formes ont des fonctions pour trouver le nombre d'octets dans une allocation, par ex. Symbian comme une fonction AllocSize(ptr).

5

Le pointeur ne conserve aucune trace du nombre d'objets alloués derrière le (premier) point vers lequel il pointe. C'est parce qu'il ne peut pas: malloc() renvoie juste l'adresse du premier élément, rien d'autre.

Par conséquent, il n'existe aucun moyen de connaître la taille d'un tableau alloué dynamiquement. Vous devez en garder la trace pour vous-même.

2

Un pointeur pointe uniquement vers l'endroit où les données commencent. Il ne sait rien de la taille des données.

Questions connexes