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

时间:2018-10-18 15:54:53

标签: c pcap pointer-to-pointer

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

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

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

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

它返回:

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并将其传递给函数不起作用。

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

由于alldevspoutput parameter,因此该参数将用于从函数(pcap_findalldevs)返回值给调用者(您的代码)。

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

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

答案 2 :(得分:0)

因为您必须传递指向某物的指针,并且某物为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被修改-必须通过引用来完成。