如何使用 union 或可能使用 enum 做别名?
How to do aliasing with union or possible with enum?
我看完了这篇很好的文章
但我不了解 union 的别名,我所知道的别名是 char/ unsigned char
,根据本文,这是一个编译器异常。所以,我以前用 char/ unsigned char
做别名的方式就像
// lets say I have struct blah , having int member non_sense, cmmn_sense, intelligence...
struct blah *foo, *foo2;
unsigned char buffer [512];
foo = (struct blah *) (buffer+0);
//now accessing members
foo->non_sense = -1;
foo->non_snese = 0;
foo->intelligence =1;
// now we can use another struct after that ..
foo2 = (struct blah*) (buffer + sizeof(struct blah));
如有错误请指正:)
Q.So 我怎样才能用 union 做同样的事情?
注意我没怎么接触过union,所以我也不知道它的正确用法。
我也搜索过 enum
的别名,但不太了解,
Q.If 可以使用枚举我们将如何做到这一点?
抱歉我的英语不好,请公开建议纠正我的错误概念或问题中的术语以更正...
是的,几乎所有指针(包括您的示例)都是不安全的(除非它被 char
访问)。
以下是安全的(通过字符指针访问):
struct blah x;
char *y = (char *)&x;
for(size_t i = 0; i < sizeof(x); i++)
printf("[%zu] = %hhd\n", i, y[i];
正确的方法是 memcpy
缓冲到结构中或将 char 数组作为联合成员之一。
struct a
{
int a;
short b;
char x[2];
double z[3];
};
union b
{
unsigned char buffer[512];
struct a sa[512/32];
};
double foo(char *x)
{
struct a c;
memcpy(&c, x, sizeof(c));
return c.z[0];
}
double bar(void)
{
union b c;
read_from_uart(&c, 512);
return c.sa[5].z[1];
}
Q.If possible with enum how will we do that?
Enum is an integer. Same rules as for integers.
我看完了这篇很好的文章
但我不了解 union 的别名,我所知道的别名是 char/ unsigned char
,根据本文,这是一个编译器异常。所以,我以前用 char/ unsigned char
做别名的方式就像
// lets say I have struct blah , having int member non_sense, cmmn_sense, intelligence...
struct blah *foo, *foo2;
unsigned char buffer [512];
foo = (struct blah *) (buffer+0);
//now accessing members
foo->non_sense = -1;
foo->non_snese = 0;
foo->intelligence =1;
// now we can use another struct after that ..
foo2 = (struct blah*) (buffer + sizeof(struct blah));
如有错误请指正:)
Q.So 我怎样才能用 union 做同样的事情?
注意我没怎么接触过union,所以我也不知道它的正确用法。
我也搜索过 enum
的别名,但不太了解,
Q.If 可以使用枚举我们将如何做到这一点?
抱歉我的英语不好,请公开建议纠正我的错误概念或问题中的术语以更正...
是的,几乎所有指针(包括您的示例)都是不安全的(除非它被 char
访问)。
以下是安全的(通过字符指针访问):
struct blah x;
char *y = (char *)&x;
for(size_t i = 0; i < sizeof(x); i++)
printf("[%zu] = %hhd\n", i, y[i];
正确的方法是 memcpy
缓冲到结构中或将 char 数组作为联合成员之一。
struct a
{
int a;
short b;
char x[2];
double z[3];
};
union b
{
unsigned char buffer[512];
struct a sa[512/32];
};
double foo(char *x)
{
struct a c;
memcpy(&c, x, sizeof(c));
return c.z[0];
}
double bar(void)
{
union b c;
read_from_uart(&c, 512);
return c.sa[5].z[1];
}
Q.If possible with enum how will we do that? Enum is an integer. Same rules as for integers.