C 将指向堆栈分配数组的指针传递给函数

C 将指向堆栈分配数组的指针传递给函数,c,function,stack,parameter-passing,allocation,C,Function,Stack,Parameter Passing,Allocation,我有一个与以下原型相关的函数,第三个参数(输出变量)是唯一相关的: int ioman_write_pages(void**, unsigned, HDD_address**, /*rest is irrelevant*/) HDD_地址类型,以防有人询问: typedef union { unsigned long long address; struct { unsigned long long offset : 12; unsigned lon

我有一个与以下原型相关的函数,第三个参数(输出变量)是唯一相关的:

int ioman_write_pages(void**, unsigned, HDD_address**, /*rest is irrelevant*/)
HDD_地址类型,以防有人询问:

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):

上面的堆分配没有问题

但是,如果我尝试堆栈分配“页面”:

HDD_address page[pagecount];
memset( page, 0, pagecount * sizeof(HDD_address) );

ioman_write_pages( data, 3, &page, block, NULL, NULL );
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: [166956, 0, 0]
编译上述文件时出现编译警告:

note: expected ‘union HDD_address **’ but argument is of type ‘union HDD_address (*)[(sizetype)(pagecount)]’
堆栈分配,“修复”警告:

HDD_address page[pagecount];
memset( page, 0, pagecount * sizeof(HDD_address) );

ioman_write_pages( data, 3, &page, block, NULL, NULL );
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]

我完全搞不懂,请有人给我点化一下

如果必须向它传递一个双指针,则函数本身可能会进行分配(并更改指针)。

这是我自己的函数,调用者(应该)负责分配第三个参数。但事实并非如此,它确实重新分配了。。解决了它。