3 回答

TA貢獻(xiàn)1848條經(jīng)驗 獲得超2個贊
我相信問題是您的陣列在堆棧上。因為在函數(shù)啟動時堆棧指針可以是任何東西,所以如果不分配過多的內(nèi)存并進(jìn)行調(diào)整,就無法對齊數(shù)組。如果將數(shù)組移出函數(shù)并移至全局變量,則該數(shù)組應(yīng)該起作用。您可以做的另一件事是將其保留為局部變量(這是一件非常好的事情),但要使其成為static。這樣可以防止將其存儲在堆棧中。請注意,這兩種方式都不是線程安全的或遞歸安全的,因為將只有該數(shù)組的一個副本。
使用此代碼:
#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
這是預(yù)期的。使用您的原始代碼,我將像您一樣獲得隨機(jī)值。

TA貢獻(xiàn)1780條經(jīng)驗 獲得超1個贊
最近的GCC(經(jīng)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 關(guān)注
- 880 瀏覽
添加回答
舉報