PDA

Visualizza la versione completa : [C] Dimensioni tipi di dato


Satiro88
04-02-2014, 13:22
Ciao a tutti! temo sia di una banalità talmente sconcertante che pare nessuno l'abbia mai chiesto su questo forum(probabilmente causa ritorsioni).

Avrei bisogno di fare chiarezza su qualche punto, stavo utilizzando uno strumento molto utile,chiamato compileonline(spero non ci siano problemi se faccio pubblicità),questi non ha fatto altro che generare ancora più confusione rispetto a quel poco che sapevo.

immaginiamo la seguente struttura


typedef struct nd{
int i;
char c;
struct nd*next;}nodo;




mentre nel main:


main(){
int *a;
char *p;
char s[10]="0";
nodo * l;
void * v;
}

quali valori avranno questi elementi?sullo strumento prima menzionato facendo,per esempio,sizeof ritorna

a=8
p=8
s=10
l=8
v=8

Qualcuno,per favore,potrebbe spiegarmi come si calcolano?

Grazie mille,ciao!

oregon
04-02-2014, 13:27
I puntatori sono a 64 bit e il vettore è di 10 char

La grandezza del puntatore non si "calcola" ... dipende dal sistema e dal compilatore.

Satiro88
04-02-2014, 13:32
mmmm ma s è comunque un puntatore, allora perchè torna solo 10? cioè p è grande 8 byte perchè si e punta cose a caso,quindi immagino lo consideri come se non ci fosse nulla puntato facendo la sizeof,mentre s è un puntatore a carattere con la differenza che ha in più 10 valori collegati tra loro

oregon
04-02-2014, 13:44
Perché il nome del vettore è ANCHE il puntatore al primo elemento. Ma prima di tutto è un vettore di 10 char e la sizeof fa un'eccezione ... (vale solo per gli array allocati staticamente).

Come puntatore potresti controllare il sizeof di &s[0]

Satiro88
04-02-2014, 14:14
se faccio come dici tu,mandandogli l'indirizzo mi torna 8 altrimenti 0 senza la "&". Quindi allora, salvo ulteriori specificazioni prima tiene conto del fatto che si tratti di un vettore di 10 caratteri e quindi conta lo spazio occupato da questi.In realtà però sarebbero di più quindi,cioè i 10 caratteri più il puntatore che sono 8byte.
Se in un esercizio mi chiedono per esempio di riportare le dimensioni di char s[10] io cosa dovrei scrivere? 10 o 18?
Ancora una volta XD, se io ho char *p void*p int*p longint*p indipendentemente p misurerà 8 byte corretto?

oregon
04-02-2014, 14:18
No ... non fare confusione ...

La sizeof del vettore staticamente allocato riporta la dimensione in byte del vettore (nel tuo caso 10).

La sizeof di un puntatore (come è anche &s[0]) riporta il numero di byte usati per un puntatore dal sistema.

Non puoi "sommare" la dimensione dei dati con la dimensione del puntatore, non ha senso.

La dimensione di s[10] (se sono char) è 10. Ovviamente è diverso se sono int o altro.

Tutti i puntatori hanno medesima dimensione, nello stesso programma e sistema.

Satiro88
04-02-2014, 14:30
continuo a non capire come faccia un puntatore ,da solo,a misurare 8byte e un puntatore a 10 caratteri a misurare 10byte.Cioè sembra come se anche il puntatore "da solo" punti a qualcosa tale da farlo misurare 8 byte e appena viene sovrascritto da qualcosa,tipo 10 caratteri,prende le dimensioni corrispondenti

oregon
04-02-2014, 14:39
Tu non hai chiaro il concetto di puntatore.

Un puntatore è "numero" che rappresenta un indirizzo e questo numero misura 8 byte (per i 64 bit) o 4 byte (per i 32 bit).

Un puntatore è solo l'indirizzo.

Quello a cui punta il puntatore (ovvero il dato) è un'altra cosa. Non li devi "sommare".

Satiro88
04-02-2014, 14:44
Ok,quindi io scrivendo s[10] e facendo sizeof(s) gli sto dicendo di calcolare la dimensione del contenuto,cioè 10 caratteri nel nostro caso.
Però torno al problema di prima, se ho un esercizio che mi chiede di calcolare i byte totali utilizzati nel record di attivazione del main e gli passo s[10] dovrò tener conto sia delle dimensioni del suo contenuto sia delle dimensioni dello spazio che contiene l'indirizzo per raggiungere questi 10 caratteri?

oregon
04-02-2014, 14:46
Ok,quindi io scrivendo s[10] e facendo sizeof(s) gli sto dicendo di calcolare la dimensione del contenuto,cioè 10 caratteri nel nostro caso.




Però torno al problema di prima, se ho un esercizio che mi chiede di calcolare i byte totali utilizzati nel record di attivazione del main e gli passo s[10] dovrò tener conto sia delle dimensioni del suo contenuto sia delle dimensioni dello spazio che contiene l'indirizzo per raggiungere questi 10 caratteri?

No. Se c'è char s[10] sommerai 10, se c'è char s* sommerai 8

Loading