**已关闭。**此问题需要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
并将其传递给函数就不起作用。
3条答案
按热度按时间ocebsuys1#
库需要一个指向指针的指针,这样它就可以写入你的指针。
这意味着你的程序需要为指针分配内存。
第一个例子是有效的,因为
pcap_if_t *dvs;
在堆栈上为指针保留了一些内存,然后你把这个内存的 address 传递给pcap_findalldevs
函数。第二个版本失败了,因为
pcap_if_t **dvs
没有指向任何地方的真实的内存。编译器甚至警告你它没有初始化。z4bn682m2#
因为
alldevsp
是一个输出参数,所以该参数将用于从函数(pcap_findalldevs
)向调用方(您的代码)返回值。为了达到这个目的,参数应该通过引用传递,因为在C中没有引用这样的东西,所以使用了指针。
总结如下:库使用你提供的指针来知道在哪里写入数据,这就是为什么你需要传递一个指针,指向一个已经存在的变量。
jm81lzqq3#
因为你必须传递一个指针到 something,这个指针是
dvs
,它的类型是pcap_if_t*
,当你删除pcap_if_t** dvs
,传递&dvs
时,你传递的是pcap_if_t***
,这不是预期的类型。如果您有:
那么
dvs
将具有期望的类型,但是将指向noting valid(未初始化)。对于
pcap_findalldevs()
,函数 * modify *dvs
的值,要做到这一点,它必须有一个指针指向它,而不仅仅是它的副本-修改副本不会导致dvs
被修改-它必须通过引用完成。