0
我有下面的原型中,第三參數(輸出變量)的功能是唯一的相關的:傳遞指針堆棧分配的數組起作用
int ioman_write_pages(void**, unsigned, HDD_address**, /*rest is irrelevant*/)
萬一有人的HDD_address類型問:
HDD_address* page = (HDD_address*)malloc(pagecount * sizeof(HDD_address));
memset(page, 0, pagecount * sizeof(HDD_address));
ioman_write_pages(data, 3, &page, block, NULL, NULL);
printf("Pages written to: [%d, %d, %d]\n",
page[0].address >> 9,
page[1].address >> 9,
page[2].address >> 9);
:
typedef union {
unsigned long long address;
struct {
unsigned long long offset : 12;
unsigned long long page_number : 26;
unsigned long long : 0;
} paddress;
} HDD_address;
與堆分配(正常使用)呼叫方案
輸出(應爲:0,16,24):
Pages written to: [0, 16, 24]
上面堆分配工作沒有問題。
然而,如果我嘗試的 「頁」 堆棧分配:
HDD_address page[pagecount];
memset(page, 0, pagecount * sizeof(HDD_address));
ioman_write_pages(data, 3, &page, block, NULL, NULL);
輸出,而數據明智荒謬的,它是一致的:在編譯以上時
Pages written to: [166956, 0, 0]
編譯警告:
note: expected ‘union HDD_address **’ but argument is of type ‘union HDD_address (*)[(sizetype)(pagecount)]’
堆棧分配,「固定」的警告:
DD_address page[pagecount];
memset(page, 0, pagecount * sizeof(HDD_address));
HDD_address* ppage = page;
int r = ioman_write_pages(data, 3, &ppage, block, NULL, NULL);
輸出,再次一致每次運行,但廢話:
Pages written to: [1610376, 2856870, 610607]
我不能讓這個任何意義,有人請賜教!
這是我自己的功能,調用者(據說)負責分配第三個參數。 但事實並非如此,事實上它確實重新分配了。修復它解決了它。 – Skod 2013-04-21 21:19:57