- 论坛徽章:
- 0
|
原帖由 iterator 于 2008-5-19 12:48 发表
那个str应该不是32位对齐的呀
对,我刚才想叉了,它没对齐到自然边界,按理是有问题的。
但我在RSIC平台上做了一个实验,在这个平台上,不对齐的访问会引发一个错误。非常意外的发现,结构体内的不对齐的指针赋值没有问题,但自己构造的未对齐指针赋值就有错。下面是程序和结果
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 struct p
5 {
6 char a;
7 char *str; //这里的指针也没对齐到自然边界
8 char b;
9 } __attribute__ ((packed)) x;
10
11 int main()
12 {
13 char buf[10];
14 unsigned long addr = (unsigned long)&x.str;
15 int *pp = (int *)&buf[1]; //这是个不对齐的数据访问
16 char **str = (char **)&buf[1]; //这个是个不对齐的指针
17
18 *pp = 100; //出错
19 *str = "hello"; //出错
20 printf("%d,%#lx\n", sizeof(x), addr);
21 x.str = "hello"; //没问题
22 printf("%s\n", x.str);
23
24 }
下面是运行结果:
[xin@vti-build tmp]$ ./t_align
t_align(18426): unaligned access to 0x60000fffffffb6a1, ip=0x4000000000000690
t_align(18426): unaligned access to 0x60000fffffffb6a1, ip=0x40000000000006b1
10,0x60000fffffffb691
hello
注意3个地址都是奇数结尾的,都没对齐到自然边界,但结构体内那个操作没出错
糊涂了,大家有什么看法,我也再想想 |
|