Ste*_*ngs 2 c microcontroller pointers structure dereference
以下代码在运行时崩溃了我的微处理器.
struct dummytype dummy;
struct crummytype crummy;
*(unsigned int*)&dummy = *(unsigned int*)&crummy;
Run Code Online (Sandbox Code Playgroud)
假设两个结构都是相同的大小,这个代码是否有一些无效的C?它的有效性是否取决于任何特定的?
这仅在两个结构都具有unsigned int
第一个成员时才有效.
C99§6.7.2.1/ 13
在结构对象中,非位字段成员和位字段所在的单元具有按声明顺序增加的地址.指向适当转换的结构对象的指针指向其初始成员(或者如果该成员是位字段,则指向它所在的单元),反之亦然.结构对象中可能存在未命名的填充,但不是在其开头.
简单地说,给定一个结构对象的地址,您可以将该地址转换为指向第一个成员类型的指针:
struct A
{
unsigned int n;
char junk[5];
};
struct A a;
unsigned int *p = (unsigned int *)&a; // OK. pointer is proper for first member type
unsigned long*x = (unsigned long *)&a; // BAD
Run Code Online (Sandbox Code Playgroud)
简而言之,只有当两种结构类型都有unsigned int
第一个成员时,您的代码才是合法的.其他任何东西都是未定义的行为(void *
不能承受,但由于它是不可解除的,它实际上不适用于此).每种结构类型"足够大"以容纳一个unsigned int
是不够的.他们的第一个成员实际上必须是unsigned int
.