下面是我正在查看的代码:

void add_to_pfds(struct pollfd *pfds[], int newfd, int *fd_count, 
      int *fd_size)
{
     // If we don't have room, add more space in the pfds array
     if (*fd_count == *fd_size) {
        *fd_size *= 2; // Double it

        *pfds = realloc(*pfds, sizeof(**pfds) * (*fd_size));
     }

    (*pfds)[*fd_count].fd = newfd;
    (*pfds)[*fd_count].events = POLLIN; // Check ready-to-read

    (*fd_count)++;
}

如果这看起来很熟悉,那是因为它来自Beej的网络编程指南.

我不明白的是(*pfds)[*fd_count].fd = newfd;.pfds是一个struct pollfd指针array.在我的理解中,(*pfds)首先取消引用数组,导致一个structpollfd指针,数组的第一个元素.然后我们索引到数组中,索引为*fd_count.这不应该导致另一个pollfd指针吗?那么,我们如何使用period操作符访问该 struct 的.fd成员呢?我们是不是应该用—操作符来代替?>

我在某个地方漏掉了什么.有人能给我一个正确的思考方法吗?

推荐答案

struct pollfd *pfds[]是指向struct pollfd的指针.(这是一个指针而不是数组,因为这是一个函数参数)

(*pfds)是指向struct pollfd的指针.这相当于pfds[0].

(*pfds)[*fd_count],相当于pfds[0][*fd_count],是struct pollfd.使用点.操作符访问struct的成员是很自然的.

C++相关问答推荐

如何将一个enum类型类型转换为另一个类型?

字符串令牌化xpath表达式

两个连续的语句是否按顺序排列?

以前版本的tty_ldisc_ops.ioctl()是否也需要文件参数?

变量>;-1如何在C中准确求值?

我可以在C中声明不同长度数组的数组而不带变量名吗?

为什么net/if.h在ifaddrs.h之前?

Rust FFI--如何用给出返回引用的迭代器包装C风格的迭代器?

这个C程序在工作中途停止获取输入.我收到分段故障(核心转储).我还是不知道问题出在哪里

如何在C中只对字符串(包含数字、单词等)中的数字进行重复操作?

条件跳转或移动取决于未初始化值(S)/未初始化值由堆分配创建(Realloc)

C-try 将整数和 struct 数组存储到二进制文件中

S,在 struct 中创建匿名静态缓冲区的最佳方式是什么?

C中的char**v*char[]

如何解释数组中的*(ptr)和*(ptr+2)?

为什么这个代码的最后一次迭代不能正常工作?

传递参数:C 和 C++ 中 array 与 *&array 和 &array[0] 的区别

Makefile - 将 .o 文件放入子文件夹中

如何正确探测平台设备?

C语言程序流程解释