首页 > 解决方案 > 如何解决 C 中指向不完整类型的解引用指针?

问题描述

我试图修改 Hostapd 的代码来读取 nl_pid。在我修改代码如下图并编译后。

wpa_printf(MSG_DEBUG, "nl80211: Subscribe to mgmt frames with AP "
       "handle %p", bss->nl_mgmt);
printf("%u", bss->nl_mgmt->s_local->nl_pid);

编译器说“取消引用指向不完整类型结构 nl_sock 的指针”。

../src/drivers/driver_nl80211.c: In function 'nl80211_mgmt_subscribe_ap':
../src/drivers/driver_nl80211.c:2449:30: error: dereferencing pointer to incomplete type 'struct nl_sock'
2449 |     printf("%u", bss->nl_mgmt->s_local->nl_pid);
     |     
make: *** [Makefile:1293: ../src/drivers/driver_nl80211.o] Error 1

所以,我在第 2449 行注释并再次重新编译。然后使用gdb在第 2451 行中断并打印“bss->nl_mgmt 变量”。gdb可以知道和阅读结构。为什么gdb可以知道和阅读结构,但我不能?我怎样才能解决这个问题并阅读我想要的“nl_pid”?

Breakpoint 1, nl80211_mgmt_subscribe_ap (bss=0x4cdf60) 
    at ../src/drivers/driver_nl80211.c:2451 
2451        for (i = 0; i < ARRAY_SIZE(stypes); i++) { 
(gdb) print *bss->nl_mgmt 
$1 = {s_local = {nl_family = 16, nl_pad = 0, nl_pid = 2810203079, nl_groups = 0}, s_peer = {nl_family = 16, nl_pad = 0, nl_pid = 0, nl_groups = 0}, s_fd = 8, s_proto = 16, s_seq_next = 1578026322, s_seq_expect = 1578026322, s_flags = 0, s_cb = 0x4ce7b0, s_bufsize = 0}

标签: cgdbhostapd

解决方案


的定义struct nl_sock必须存在于您正在编译的 .c 中(或包含在包含的文件中)。该定义告诉编译器位于什么偏移s_local处,这是编译该表达式需要知道的。


推荐阅读