在 C++ 中将 pcap_if_t* 转换为 pcap_if_t**

casting pcap_if_t* to pcap_if_t** in c++

我正在使用 pcap 库处理 sniff C++ 中的网络流量。 在 pcap 库中,pcap_if_t 是一个 struct,如下所示:

struct pcap_if {
    struct pcap_if *next;
    char *name;     /* name to hand to "pcap_open_live()" */
    char *description;  /* textual description of interface, or NULL */
    struct pcap_addr *addresses;
    bpf_u_int32 flags;  /* PCAP_IF_ interface flags */
};
typedef struct pcap_if pcap_if_t;

现在,我对在 int pcap_findalldevs(pcap_if_t **, char *); 原型中使用 &alldevs 值作为波纹管代码中的第一个值感到困惑。而 pcap_if_t *alldevs 是一个指针,与 pcap_if_t ** 参数不匹配(这是一个引用另一个指针的指针)。

pcap_if_t *alldevs;
char errbuf[PCAP_ERRBUF_SIZE];

/* Retrieve the device list from the local machine */
if (pcap_findalldevs(&alldevs, errbuf) == -1)
{
    fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf);
    exit(1);
}

例如,我甚至用 int **arr 语句测试 "pointer to pointer"(指针链)。我将 int **arr 定义为 matrix :

int **arr = new int*[5];
for(int i = 0; i < 5; i++)
{
    arr[i] = new int[3];
}

然后定义了void print_arr(int **arr, int r, int c)函数,由于打印了matrix值并给了它两个不同的参数(arr&arr2):

int *arr2 = static_cast<int*>(*arr);

print_arr(arr, 5, 3);              // arr defined in top
print_arr(&arr2, 5, 4);            // arr2 is a pointer as *arr2

无论提供的示例如何,c++ 此转换的表现如何?有点模棱两可。

此上下文中的 & 运算符是 address of 运算符。当您获取变量的地址时,您将获得指向该变量的指针。指针存储地址。

例如:

int a = 1;
int *b = &a;

b 现在指向您的 a 变量。因为 a 的类型是 int&a 给你一个指向 int 的指针类型,一个 int*

如果你再做一次同样的事情会发生:

int a = 1;
int *b = &a;
int **c = &b;

现在 c 指向 b。由于 b 具有类型 int *&b 为您提供指向 int 指针的类型指针,int **

同样的事情发生在你的函数调用中

 if (pcap_findalldevs(&alldevs, errbuf) == -1)

你取 alldevs 变量的地址。因为 alldevs 的类型是 pcap_if_t* ,所以 &alldevs 的类型是 pcap_if_t**.

你也可以这样做:

  pcap_if_t *alldevs;
  pcap_if_t **alldevs_ptr = &alldevs;

 if (pcap_findalldevs(alldevs_ptr, errbuf) == -1)

我想用这段代码提供一个很好的例子:

int f = 48;
int *g = &f;
int **h = &g;
int ***i = &h;
int ****j = &i;

cout << j << endl;
cout << &i << endl;

这里,j是一个包含i地址的链指针,所以输出如下:

0x7ffe373a6220
0x7ffe373a6220

显示的两个结果要么是j值(地址pointed到),要么是i内存地址,这两个是相同的,因为j包含&i.还有 h&g 作为 :

cout << h << endl;
cout << &g << endl;

此外,输出显示 h 值(指向 g 地址)和 &g,它们在这里是相同的:

0x7ffe373a6210
0x7ffe373a6210