c - gestione - Ottenere la dimensione dei dati di un puntatore



pointers memory-management (4)

Ho provato il seguente codice per vedere come ottenere la dimensione dei dati di un puntatore:

 #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;
 }

E l'output del codice è (su 32 bit 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

Ho pensato che sizeof (* test_char_ptr) mi avrebbe dato la dimensione dei dati all'interno di * test_char_ptr. Ma invece mi ha dato 1, che penso sia la dimensione di char invece dei dati. Lo stesso vale per il test_int_ptr. Per farla breve, la mia domanda è come posso ottenere la dimensione dei dati all'interno di un puntatore o di memoria dinamica allocata.

https://ffff65535.com


Il puntatore non tiene traccia del numero di oggetti che sono allocati dietro il (primo) a cui punta. Questo perché non può: malloc() restituisce solo l'indirizzo del primo elemento, nient'altro.

Perciò non c'è modo di scoprire la dimensione di un array allocato dinamicamente. Devi tenerne traccia per conto tuo.


Non è qualcosa che puoi fare in C senza mantenere le informazioni da solo. Hai creato gli array, quindi a un certo punto conoscevi le loro dimensioni, devi solo tenerne traccia da solo. È possibile creare una struttura dati per aiutarti o semplicemente mantenere le informazioni sulla matrice e sulla dimensione con attenzione senza alcuna struttura di dati.

Inoltre, il tuo codice utilizza strlen() per ottenere la dimensione della stringa - assicurati di ricordare che la dimensione restituita non includerà il carattere null terminante ( '\0' ); la dimensione in memoria di una costante di stringa è strlen(string) + 1 .


Un puntatore indica solo dove inizia il dato. Non sa nulla della dimensione dei dati.


sizeof conosce solo l'intera dimensione dell'array se questo è statisticamente noto al momento della compilazione. Per un puntatore, restituirà la dimensione dell'indirizzo di memoria, cioè 4 su 32-bit, 8 su 64-bit.

Quando usi i puntatori, sta a te sapere e tenere traccia delle dimensioni dei dati a cui punta. L'implementazione della lingua non lo farà per te come sarebbe per gli array.





sizeof