如何解决如何使用联合或可能使用枚举做别名?
我已经阅读了这篇非常好的文章
https://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule
但我不了解使用 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));
如果我错了,请纠正我:)
问:那么我怎样才能对 union 做同样的事情?
注意union我接触的不多,所以我也不知道它的正确用法。
我也用 enum
搜索过别名,但不太了解,
问:如果可以使用枚举,我们将如何做?
对不起,我的英语不是很好,请公开建议纠正我在问题中的误解或术语以更正......
解决方法
是的,几乎任何指针(包括您的示例)都是不安全的(除非它被 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];
}
问:如果可以使用枚举,我们将如何做到这一点? 枚举是一个整数。与整数相同的规则。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。