3 回答
TA贡献1848条经验 获得超2个赞
我相信问题是您的阵列在堆栈上。因为在函数启动时堆栈指针可以是任何东西,所以如果不分配过多的内存并进行调整,就无法对齐数组。如果将数组移出函数并移至全局变量,则该数组应该起作用。您可以做的另一件事是将其保留为局部变量(这是一件非常好的事情),但要使其成为static。这样可以防止将其存储在堆栈中。请注意,这两种方式都不是线程安全的或递归安全的,因为将只有该数组的一个副本。
使用此代码:
#include <stdio.h>
float a[4] __attribute__((aligned(0x1000))) = {1.0, 2.0, 3.0, 4.0};
int
main(void)
{
printf("%p %p %p %p\n", &a[0], &a[1], &a[2], &a[3]);
}
我得到这个:
0x804c000 0x804c004 0x804c008 0x804c00c
这是预期的。使用您的原始代码,我将像您一样获得随机值。
TA贡献1780条经验 获得超1个赞
最近的GCC(经4.5.2-8ubuntu4测试)似乎可以正常工作,并且阵列正确对齐。
#include <stdio.h>
int main(void)
{
float a[4] = { 1.0, 2.0, 3.0, 4.0 };
float b[4] __attribute__((aligned(0x1000))) = { 1.0, 2.0, 3.0, 4.0 };
float c[4] __attribute__((aligned(0x10000))) = { 1.0, 2.0, 3.0, 4.0 };
printf("%p %p %p %p\n", &a[0], &a[1], &a[2], &a[3]);
printf("%p %p %p %p\n", &b[0], &b[1], &b[2], &b[3]);
printf("%p %p %p %p\n", &c[0], &c[1], &c[2], &c[3]);
}
我得到:
0x7ffffffefff0 0x7ffffffefff4 0x7ffffffefff8 0x7ffffffefffc
0x7ffffffef000 0x7ffffffef004 0x7ffffffef008 0x7ffffffef00c
0x7ffffffe0000 0x7ffffffe0004 0x7ffffffe0008 0x7ffffffe000c
- 3 回答
- 0 关注
- 855 浏览
添加回答
举报