IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Struktura - uložení v paměti

Aktivity
Avatar
Neaktivní uživatel:6.6.2014 22:46

Je dáno nějakým standardem, jak musí být jednotlivé složky struktury uloženy v paměti? Třeba zasebou, takže následující příklad bude fungovat

struct A
{
  int X;

  double Y;
  char Z;
};
struct B
{
  int R;

  float S;
  double T;
};

struct A* a = (struct A*)malloc(sizeof(struct A));
a->X = 42;
struct B* b = (struct B*)a;
printf("%d", b->R);

Budu mít zaručené, že to vytiskne 42? Těmi složkami Y, Z, S, T jsem chtěl naznačit, že struktury budou mít stejný začátek a jiný konec. Chápete, co jsem se snažil vysvětlit?

EDIT: Teď to zkouším jen na VC++, kde to funguje, ale pak bych to chtěl dávat na různé mikroprocesory, a tam kdo ví, co jsou za překladače a jak dělají. Takže teoreticky, když to bude v nějakém standardu a ty překladače to splňují, tak bych se nemusel o nic bát.

Editováno 6.6.2014 22:48
Odpovědět
6.6.2014 22:46
Neaktivní uživatelský účet
Avatar
Silvinios
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Silvinios:6.6.2014 22:56

Ano, kód fungovat bude. Standard zaručuje, že proměnné definované později mají vyšší adresu.

 
Nahoru Odpovědět
6.6.2014 22:56
Avatar
coells
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
coells:6.6.2014 23:31

Bude to fungovat, pokud budou typy ve struktuře identické a dodrží se pořadí:

struct A
{
  int X;
  char Y;
  long Z;
  double W;
};
struct B
{
  int R;
  long S;
  char T;
  double U;
};

U příkladu výše budou X a R na stejném offsetu, ale W a U už budou na různých offsetech.

Další věcí je, že je to hodně nebezpečné, snadno můžeš zapomenout, že struktura v paměti je jiná, než typ, se kterým zrovna pracuješ. Lepší je využít uniony nebo třetí strukturu:

union AB
{
  struct A a;
  struct B b;
};

// nebo

struct C_AB
{
  int XR;
};
 
Nahoru Odpovědět
6.6.2014 23:31
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.