【发布时间】:2011-12-02 05:58:51
【问题描述】:
考虑以下 C 程序:
int main(void)
{
char string[10] __attribute__ ((aligned(32)));
int i;
int *intp = (int*)(string + 1 );
printf("string: 0x%x, intp: 0x%x\n", string, intp);
for (i=0; i<10; i++)
{
string[i] = 10;
}
dump(string);
printf("*intp: 0x%x\n", *intp);
*intp = 0xEEEEEEEE;
dump(string);
return 0;
}
所以我基本上是在强制 CPU 访问未对齐地址的 32 位数据 (int)。 TBH 我希望我的 ARM9 板上出现段错误。但相反,我得到了一些有趣/令人困惑的结果:
将intp设置为0xEEEEEEEE后,转储字符串显示:
0xee, 0xee, 0xee, 0xee, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa
所以代码实际上改变了字符串中的第一个元素!为什么?
谢谢,
【问题讨论】:
-
只是好奇:如果您尝试
int *intp = (int*)(string + 2);会发生什么? +3 怎么样? -
@cnicutar:实际上 +2 或 +3 不会有任何影响!