为什么一个双指针参数必须声明为单指针并作为&var传递给函数?[closed]

egdjgwm8  于 2022-12-17  发布在  其他
关注(0)|答案(3)|浏览(151)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
四年前关闭了。
这篇文章是编辑和提交审查3天前。
Improve this question
我想知道为什么我不能声明一个双精度指针,然后把它传递给一个函数,相反,我必须在传递双精度指针之前,首先声明被指向的指针。
例如,当我运行参数**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)

我只是想知道,如果我不事先声明所指向的指针,为什么将变量声明为**var并将其传递给函数就不起作用。

ocebsuys

ocebsuys1#

库需要一个指向指针的指针,这样它就可以写入你的指针。
这意味着你的程序需要为指针分配内存。
第一个例子是有效的,因为pcap_if_t *dvs;在堆栈上为指针保留了一些内存,然后你把这个内存的 address 传递给pcap_findalldevs函数。
第二个版本失败了,因为pcap_if_t **dvs没有指向任何地方的真实的内存。编译器甚至警告你它没有初始化。

z4bn682m

z4bn682m2#

因为alldevsp是一个输出参数,所以该参数将用于从函数(pcap_findalldevs)向调用方(您的代码)返回值。
为了达到这个目的,参数应该通过引用传递,因为在C中没有引用这样的东西,所以使用了指针。
总结如下:库使用你提供的指针来知道在哪里写入数据,这就是为什么你需要传递一个指针,指向一个已经存在的变量。

jm81lzqq

jm81lzqq3#

因为你必须传递一个指针到 something,这个指针是dvs,它的类型是pcap_if_t*,当你删除pcap_if_t** dvs,传递&dvs时,你传递的是pcap_if_t***,这不是预期的类型。
如果您有:

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

那么dvs将具有期望的类型,但是将指向noting valid(未初始化)。
对于pcap_findalldevs(),函数 * modify * dvs的值,要做到这一点,它必须有一个指针指向它,而不仅仅是它的副本-修改副本不会导致dvs被修改-它必须通过引用完成。

相关问题