我想知道为什么在传递参数**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
并将其传递给函数不起作用。
答案 0 :(得分:2)
该库需要一个指向指针的指针,以便它可以写入您的指针。
这意味着您的程序需要为指针分配的内存。
第一个示例之所以有效,是因为pcap_if_t *dvs;
在堆栈上为指针保留了一些内存。然后,将该内存的地址传递到pcap_findalldevs
函数中。
第二个版本失败,因为pcap_if_t **dvs
没有指向任何地方的实际内存。编译器甚至警告您未初始化。
答案 1 :(得分:1)
由于alldevsp
是output 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
被修改-必须通过引用来完成。