2012-12-22 4 views
9

Eventuali duplicati:
How to find the sizeof(a pointer pointing to an array)C, malloc() e lunghezza dell'array

sto imparando come creare un array dinamico in C, ma sono imbattuto in un problema che posso capisco.

Se uso il codice:

int num[10]; 
for (int i = 0; i < 10; i++) { 
    num[i] = i; 
} 
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0])); 

ottengo l'output:

sizeof num = 40 
sizeof num[0] = 4 

Questo è quello che mi aspetto che accada. Tuttavia, se mi malloc la dimensione della matrice come:

int *num; 
num = malloc(10 * sizeof(int)); 
for (int i = 0; i < 10; i++) { 
    num[i] = i; 
} 
printf("sizeof num = %li\n sizeof num[0] = %li", sizeof(num), sizeof(num[0])); 

Allora ottengo l'output:

sizeof num = 8 
sizeof num[0] = 4 

Sono curioso di sapere il motivo per cui la dimensione della matrice è 40 quando uso il fisso metodo di lunghezza, ma non quando uso malloc().

+0

'num' è puntatore a int nel secondo caso e la sua dimensione dipende dalla macchina, cioè per 32 bit è di 4 byte e per 64 bit è di 8 byte. Nel primo caso num non è puntatore, è' base indirizzo 'di matrice così' sizeof() 'indica la dimensione totale dell'array. . – krpra

risposta

16

Nel secondo caso, num non è un array, è un puntatore. sizeof ti dà la dimensione del puntatore, che sembra essere 8 byte sulla tua piattaforma.

Non c'è modo di conoscere la dimensione di un array allocato dinamicamente, è necessario salvarlo da qualche altra parte. sizeof esamina il tipo, ma non è possibile ottenere un tipo di array completo (tipo array con una dimensione specificata, come il tipo int[5]) dal risultato di malloc in qualsiasi modo e l'argomento sizeof non può essere applicato a un tipo incompleto , come int[].

+0

sai come funziona la funzione 'free', il compilatore o il/O tiene traccia/record dei pezzi allocati nell'heap, quindi con il solo puntatore che fornisce può essere liberato senza bisogno di numero' num', quindi perché i compilatori possono fornire un funzionalità agli utenti per recuperare questo 'num' dai record dell'heap? Poiché è già stato lì ... ogni volta che l'utente chiama 'free (ptr)' –

+0

@BuddhikaChaturanga Scusa non sono sicuro di averlo capito correttamente: stai chiedendo perché le implementazioni non espongono i dettagli sulla quantità di memoria allocata nell'heap? Come, dato un puntatore ottieni informazioni? – effeffe

+0

sì ... Se hanno già informazioni sui dati allocati dinamicamente, se li usano per 'free', allora perché non possono fornire funzionalità all'utente (Sviluppatori) per ottenere tali informazioni ... :) –

2

La seconda dimensione si riferisce alle dimensioni di un puntatore, che nella macchina, probabilmente 64 bit, è 8 byte.

Non è possibile utilizzare sizeof() per ripristinare la dimensione di una struttura allocata dinamicamente, ma è possibile farlo per quelli allocati staticamente.

4

Gli array non sono puntatori (il decadimento dei puntatori in alcune situazioni, non qui).

Il primo è un array, quindi sizeof fornisce la dimensione dell'array = 40 byte.

Il secondo è un puntatore (indipendentemente dal numero di elementi a cui punta) - sizeof fornisce sizeof(int*).

0

Se si desidera conoscere la dimensione di qualcosa che è stato assegnato, è necessario "ricordarsi" di sé, poiché il codice ha eseguito l'allocazione. Se il codice non ha eseguito l'allocazione, non è possibile in alcun modo [in senso standard] scoprire quanto grande è la memoria su cui punta il puntatore. Devi solo "sapere" in un altro modo.