#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
答案 0 :(得分:3)
除非您在具有非常定义的语义的编译器上编写微控制器,否则您不应该这样做。原因是结构可能有填充,计算机可能是小端或大端,sizeof(int)
在所有计算机上都不一样,char
也不一定是8位。
除此之外,您的str
太短了。
虽然这是C中未定义的行为,但在微控制器上,这些东西通常都是明确定义的并且可以使用。一个例子是:
unsigned char str[sizeof(struct mystruct)];
struct mystruct* obj = (void *)str;
要知道str
和obj
的内容之间的转换,您需要准确了解编译器如何填充结构以及每个成员的大小和计算机的字节序。
同样,除非在非常具体的位置,否则这种编码是完全错误的。