PDA

Visualizza la versione completa : [C] Strano risultato sizeof()


p.turrini
03-03-2006, 18:57
Ciao a tutti,
mi succede una cosa strana:
ho questa struttura


struct rec_1
{
unsigned short num_files;
unsigned short files_num;
unsigned char zeroes[49];
};


e
sizeof(unsigned short)=2
sizeof(unsigned char)=1

Non ci crederete ma
sizeof(rec_1)=54
:bh: :bh: :bh:

FelixR
03-03-2006, 19:14
non vorrei dire una fesseria, in caso mi correggeranno, ma l'array occupa 50 e non 49 perch c' il carattere \0 che ne indica la fine.

p.turrini
03-03-2006, 19:21
Non credo che il problema sia quello perch se metto un array di 50 la misura resta 54... :bh:

Ho anche provato a cambiare compilatore ma nulla!!! :dh:

Samuele_70
03-03-2006, 19:24
Originariamente inviato da FelixR
non vorrei dire una fesseria, in caso mi correggeranno, ma l'array occupa 50 e non 49 perch c' il carattere \0 che ne indica la fine.
Il terminatore '\0' non viene messo automaticamente.
Da zeroes[0] a zeroes[49] sono 50 caratteri, tutto qui.

p.turrini
03-03-2006, 19:28
Ragazzi scusate, un po' che non programmo in C ma se io dichiro un array di 49 o di 50 all'interno della struttura il sizeof d sempre 54.
Se poi dichiaro un array di 51 il sizeof va a 56...

Non il termonatore di stringa!!!

XWolverineX
03-03-2006, 19:33
La grandezza di una struttura non deve essere necessariamente la somma dei dati membro.

p.turrini
03-03-2006, 19:34
Deve sfuggirmi qualcosa di fondamentale a livello di sintassi.
Qualcuno pu provare a compilare al volo questo:



typedef struct rec49
{
short num_files;
short files_num;
char zeroes[49];
} trec49;

typedef struct rec50
{
short num_files;
short files_num;
char zeroes[50];
} trec50;

typedef struct rec51
{
short num_files;
short files_num;
char zeroes[51];
} trec51;

int main(void)
{
trec49 r49;
trec50 r50;
trec51 r51;

printf("r49 %d \n",sizeof(r49));
printf("r50 %d \n",sizeof(r50));
printf("r51 %d \n",sizeof(r51));

return(1);
}


Mi sembra incredibile... :bh: :bh:

XWolverineX
03-03-2006, 19:40
Bhe se non includi stdio non compiler mai



#include <stdio.h>
#include <process.h>

typedef struct rec49
{
short num_files;
short files_num;
char zeroes[49];
} trec49;

typedef struct rec50
{
short num_files;
short files_num;
char zeroes[50];
} trec50;

typedef struct rec51
{
short num_files;
short files_num;
char zeroes[51];
} trec51;

int main(void)
{
trec49 r49;
trec50 r50;
trec51 r51;

printf("r49 %d \n",sizeof(r49));
printf("r50 %d \n",sizeof(r50));
printf("r51 %d \n",sizeof(r51));
system("PAUSE");

return(0);
}

Quando un programma termina correttamente meglio far ritornare 0 che 1.

p.turrini
03-03-2006, 19:45
Vuoi dire che a te non torna 54,54 e 56 invece che 53,54,55 ??? :messner:

XWolverineX
03-03-2006, 19:47
54 54 56, esatto.
Ma non deve intimorirti.
L'operatore sizeof di molto basso livello e quindi varia di macchina in macchina (intel, athlon), processori vecchi e nuovi.
Pu essere anche che tra un mese un int di adesso diventi uno short int e l'int semplice aumentato...

Loading