我有一些要理解的代码。将其存储在long int bb中后能否取回2,3,4?
当我打印出bb时,我得到772。这是一个指针值吗?
struct char_struct
{
unsigned char x;
unsigned char y;
unsigned char z;
};
union longest
{
unsigned long int aa;
struct char_struct b;
};
int main()
{
unsigned long int bb = 0;
union longest Longest;
Longest.b.x = 2;
Longest.b.y = 3;
Longest.b.x = 4;
bb = Longest.aa;
printf("%ld",bb);
return 0;
}
答案 0 :(得分:1)
C中的联盟提供了多个成员的选择,每个成员都映射到相同的内存位置。如果设置多个,则将破坏其他成员的内存。
除此之外,Longest.aa
尚未初始化,因此您正在打印垃圾值。
听起来像您想要一个结构,该结构提供了一个“垂直”成员集合,可以同时设置和访问所有成员(就像使用char_struct
一样)。结构的大小至少是其所有成员大小加上编译器添加的任何cache size alignment的总和。
这是一个示例程序,说明了以下几点:
#include <stdio.h>
struct char_struct {
unsigned char x;
unsigned char y;
unsigned char z;
};
struct longest_t {
unsigned long int aa;
struct char_struct b;
};
int main() {
unsigned long int bb = 0;
struct longest_t longest;
longest.b.x = 2;
longest.b.y = 3;
longest.b.z = 4;
longest.aa = 42;
bb = longest.aa;
printf("%ld\n", bb);
printf("%d %d %d\n", longest.b.x, longest.b.y, longest.b.z);
printf("longest_t size: %lu\n", sizeof(struct longest_t));
printf("char_struct size: %lu\n", sizeof(struct char_struct));
printf("ul int size: %lu\n", sizeof(unsigned long int));
return 0;
}
我的机器上的运行显示:
42
2 3 4
longest_t size: 16
char_struct size: 3
ul int size: 8
您可能希望typedef您的结构,尽管我确实意识到这是一个示例程序,但我建议使用更具语义意义的变量名。结构名称有一些约定,但通常变量名称不是像Longest
这样的大写字母。