В следующем коде можно ли предсказать значение int (как?), или это просто мусор?
union a
{
int i;
char ch[2];
};
a u;
u.ch[0] = 0;
u.ch[1] = 0;
cout<<u.i;
}
В следующем коде можно ли предсказать значение int (как?), или это просто мусор?
union a
{
int i;
char ch[2];
};
a u;
u.ch[0] = 0;
u.ch[1] = 0;
cout<<u.i;
}
Я бы сказал, что это зависит от размера int
и char
. union
содержит память самой большой переменной. Если int
составляет 4 байта, а char[2]
представляет 2 байта, int
потребляет больше памяти, чем char
-массив, поэтому вы не инициализируете полную int
-память 0, устанавливая все char
-переменные. Это зависит от ваших механизмов инициализации памяти, но в основном значение int
будет выглядеть случайным, поскольку дополнительные 2 байта заполнены неопределенными значениями.
Кроме того, на мой взгляд, заполнение одной переменной union
и чтение другой делает объединение небезопасным.
Если вы уверены, что int
является самым большим типом данных, вы можете инициализировать весь union
, написав
union a
{
int i;
char ch[2];
};
void foo()
{
a u = { 0 }; // Initializes the first field in the union
cout << u.i;
}
Поэтому может быть хорошей идеей разместить самый крупный шрифт в начале объединения. Хотя это не гарантирует, что все типы данных могут считаться нулевыми или пустыми, когда все биты установлены в 0.
union
. (Другим является простой полиморфизм, который не имеет значения в C++.)
- person Stefan Majewsky; 10.08.2012
union
совершенно бесполезно, так как его можно заменить на reinterpret_cast
. Тем не менее, действительно полезно в C.
- person Morwenn; 10.08.2012
union
, а другой вопрос - простогоint
. Кроме того,char
вunion
не обязательно занимают ту же память, что иint
(в большинстве реализаций на самом деле этого не происходит). Как правильно заявляют Лучиан и аскмиш, это УБ, а другое нет. - person Gorpik   schedule 10.08.2012std::memset (reinterpret_cast<char*> (&u.i), (unsigned char)0, 2);
иchar* p = &u.ch; std::memset (p, (unsigned char)0, 2);
. - person R. Martinho Fernandes   schedule 10.08.2012sizeof(int)>2
еще нельзя сказать, какое значение будет иметьu.i
. - person sellibitze   schedule 10.08.2012int
. В языке нет никаких гарантий, что все биты объекта являются частью значения.int
может иметь некоторые биты типа, говорящие машине, что этоint
. - person Bo Persson   schedule 10.08.2012