为什么必须将双指针参数声明为单指针并作为 &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
被修改 - 它必须通过引用完成。
我想知道为什么在传递参数时 **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
被修改 - 它必须通过引用完成。