为什么必须将双指针参数声明为单指针并作为 &var 传递给函数?

Why does a double pointer argument have to be declared as single pointer an passed as &var to the function?

我想知道为什么在传递参数时 **alldevsp 我必须将其声明为指针然后将其地址传递给函数,程序 运行 很好:

pcap_if_t *dvs;
int a = pcap_findalldevs(&dvs, errbuf);

但是,如果我像这样声明一个指向指针的指针:

pcap_if_t **dvs;
int a = pcap_findalldevs(dvs, errbuf);

它returns:

warning: ‘dvs’ is used uninitialized in this function [-Wuninitialized]

Segmentation fault (core dumped)

我正在使用函数:

int pcap_findalldevs(pcap_if_t **alldevsp, char *errbuf);

这里定义:https://www.tcpdump.org/manpages/pcap_findalldevs.3pcap.html 来自 pcap 库

我只是想知道为什么将变量声明为 **var 并将其传递给函数不起作用。

库需要一个指向指针的指针,以便它可以写入您的指针。

这意味着您的程序需要为指针分配内存

第一个示例有效,因为 pcap_if_t *dvs; 在堆栈上为指针保留了一些内存。然后将该内存的地址传递给pcap_findalldevs函数。

第二个版本失败,因为 pcap_if_t **dvs 没有指向任何地方的实际内存。编译器甚至会警告您它未初始化。

因为 alldevsp 是一个 output parameter,该参数将用于 return 从函数 (pcap_findalldevs) 到调用者(您的代码)。

为了实现这一点,应该传递参数 by reference 并且由于 C 中没有引用这样的东西,因此使用指针。

总而言之:该库使用您提供的指针来了解将数据写入何处,这就是为什么您需要将指针传递给 已经存在的 变量的原因。

因为你必须传递一个指向 something 的指针,而那个 something 是 dvs,它的类型是 pcap_if_t*。该指针的类型是 pcap_if_t**。当您删除 pcap_if_t** dvs 并传递 &dvs 时,您传递的是 pcap_if_t***,这不是预期的类型。

如果你有:

pcap_if_t **dvs;
int a = pcap_findalldevs(dvs, errbuf);

然后 dvs 将具有预期的类型,但会指向注释有效(未初始化)。

对于 pcap_findalldevs() 具体来说,函数 修改 dvs 的值,要做到这一点,它必须有一个指向它的指针,而不仅仅是它的副本 - 修改副本不会导致 dvs 被修改 - 它必须通过引用完成。