Jump to content

Problemas com struct


americopereira
 Share

Recommended Posts

Boas malta, tenho estado até a data a programar com o turbo c++ da borland e optei por começar a usar visual studeo.

deparei-me com o seguinte problema,

Porque é que o tamanho em bytes da estrutura ola é maior que a soma das variáveis que a compõem?

void teste()
{
struct ola{
char nome[17];
short flag;
};

char nome2[17];
short flag2;
int i1,i2,i3;

i1=sizeof(ola);
i2=sizeof(nome2);
i3=sizeof(flag2);


printf("sizeof struct : %2d\nsizeof nome2+flag2: %2d\n",i1,i2+i3);

}
Link to comment
Share on other sites

a razão esta na maneira como podes guardar elementos em memória.

se lembrares que a menor unidade de memória é 1 byte, mas o endereçamento não funciona nesse resolução.

o mínimo é 4 bytes (um inteiro)

graficamente é isto que está a acontecer :

+--byte1--+--byte2--+--byte3--+--byte4--+
| nome[0] | nome[1] | nome[2] | nome[3] |
| nome[4] | nome[5] | nome[6] | nome[7] |
| nome[8] | nome[9] | nome[10]| nome[11]|
| nome[12]| nome[13]| nome[14]| nome[15]|
| nome[16]| <-----flag------> | padding |
+---------+-------------------+---------+

o padding/stuffing/packing é usado para alinhas as estruturas a endereços de 4 bytes

é essa a razão de programadores usarem sem problemas o inteiro para representar um booleano, algo que bastaria um char (1 byte). Isto claro, se não se fizer uma gestão de memória mais afincada.

Edited by HappyHippyHippo
  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.