#include <iostream> // std::cout
using namespace std;
struct mystruct
{
unsigned int a;
unsigned char b;
unsigned long long c;
};
int main ()
{
unsigned char str[1];
unsigned int a,b,c;
str[0]=1; // str[0]=??????
mystruct* obj = (mystruct *)(&(str[0]));
c=obj->c;
a=(unsigned int)obj->a;
b=(unsigned int)obj->b;
cout<<"a="<<a<<"t b="<<b<<"t c="<<c<<endl;
}
可以做上述事情吗?如果是,则:我应该str[0]
填写什么才能获得a=1,b=257,c=1
值?
目前我得到的输出如下:
a=1 b=0 c=8388449
除非你在具有非常定义的语义的编译器上为微控制器编码,否则你不应该这样做。原因是结构可以有填充,计算机可以是小端或大端,sizeof(int)
在所有计算机上都不相同,char
也不一定是 8 位。
除此之外,你的str
无论如何都太短了。
虽然这在 C 语言中是未定义的行为,但在微控制器上,这些东西通常是明确定义的,可以使用。一个例子是:
unsigned char str[sizeof(struct mystruct)];
struct mystruct* obj = (void *)str;
要知道str
和obj
内容之间的转换,你需要确切地知道你的编译器是如何填充结构的,以及每个成员的大小和计算机的字节序。
同样,除非在非常特定的位置,否则这种编码是完全错误的。