Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

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

C a C++ C a C++ Struktura - uložení v paměti

Aktivity (1)
Avatar
Posix
Člen
Avatar
Posix: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
Proč to dělat jednoduše, když to jde složitě.
Avatar
Silvinios
Redaktor
Avatar
Odpovídá na Posix
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  +1 6.6.2014 22:56
Avatar
coells
Redaktor
Avatar
Odpovídá na Posix
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  +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.