使用结构体中成员变量指针的教训
今天碰到的问题,跟这篇文章差不多,也是有关结构体和字节对齐的事儿。
__packed struct _tag_A
{
char a;
char b;
char c;
int d;
};
void Set1(struct _tag_A *p)
{
p->d = 0x12345678;
}
void Set2(int *p)
{
*p = 0x12345678;
}
int main(void)
{
struct _tag_A s;
int i;
while(1)
{
//第一种方法
Set1(&s);
//第二种方法
Set2((int*)&(s.d));
//第三种方法
Set2(&i);
s.d = i;
}
}
上面的代码,用了三种方法,修改结构体_tag_A的成员d。这段代码在VC下面没有测试过,但是在ADS下面,编译和执行都不会报错,但是只有其中的两个执行结果是对的,另外一个是错的,你觉得是那两个呢?
这是我今天刚刚碰到的。问题倒不是什么大问题,却会象陷阱一样潜伏着,成为软件的隐患。
问题发现后,再仔细想想,其实也不难理解。第一、三种方法没有什么问题,第二种方法中,Set2函数的形参是int*,编译器对这个内存的处理默认是4字节对齐的,也就是说丢失了有关结构体的“字节对齐”的信息,而第一种和第三种都保留了这些信息,所以执行的时候也就没有什么问题了。
Copyright © 2008
分类: 软件开发 | Tags: 结构体 指针 ARM C | 添加评论(0)
相关文章:
Google Code上两个LPC21XX开源项目 (2009-7-4 14:30:32)
基于ARM的网络收音机 (2009-3-24 19:9:11)
显式指针转换的教训 (2009-2-11 18:27:21)
结构体中位段、字节对齐并用的教训 (2008-8-31 18:32:53)
C语言的跨编译器编译 (2008-8-26 18:38:15)