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]
我完全搞不懂,请有人给我点化一下 如果必须向它传递一个双指针,则函数本身可能会进行分配(并更改指针)。这是我自己的函数,调用者(应该)负责分配第三个参数。但事实并非如此,它确实重新分配了。。解决了它。