使用结构体中成员变量指针的教训


今天碰到的问题,跟这篇文章差不多,也是有关结构体和字节对齐的事儿。

__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)

相关文章:

posted on 2008-09-19 18:31  xlander  阅读(437)  评论(0编辑  收藏  举报

导航