Avatar
Posix
Člen
Avatar
Posix:

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
Proč to dělat jednoduše, když to jde složitě.
Avatar
Silvinios
Redaktor
Avatar
Odpovídá na Posix
Silvinios:

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

 
Nahoru Odpovědět  +1 6.6.2014 22:56
Avatar
coells
Redaktor
Avatar
Odpovídá na Posix
coells:

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  +1 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.