2013-04-21 79 views
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] 

我不能讓這個任何意義,有人請賜教!

回答

1

如果您必須將它傳遞給一個雙指針,則該函數可能會執行分配本身(並更改指向的指針)。

+0

這是我自己的功能,調用者(據說)負責分配第三個參數。 但事實並非如此,事實上它確實重新分配了。修復它解決了它。 – Skod 2013-04-21 21:19:57