c-如何使用并集或枚举进行混叠



我已经阅读了这篇非常好的文章

https://stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule

但我不了解带并集的别名,我所知道的关于别名的是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.那么,我怎么能对union做同样的事情呢

注意我很少遇到union,所以我也不知道它的正确用法。

我也用enum搜索过混叠,但不太了解

Q.如果可能使用enum,我们将如何做到这一点

很抱歉我的英语不太好,请公开建议纠正我在问题中的误解或术语。。。

是的,几乎任何指针(包括您的示例(都是不安全的(除非它被char访问(。

以下是安全的(通过字符指针访问(:

struct blah x;
char *y = (char *)&x;
for(size_t i = 0; i < sizeof(x); i++)
printf("[%zu] = %hhdn", 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.如果可能使用enum,我们将如何做到这一点?枚举是一个整数。与整数的规则相同。

相关内容

  • 没有找到相关文章

最新更新