这是我正在查看的代码:
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 指针的数组。根据我的理解,“(*pfds)”首先取消引用数组,从而产生单个 struct pollfd 指针,即数组的第一个元素。然后我们对数组进行索引,以索引“*fd_count”。这不应该导致另一个 pollfd 指针吗?那么我们如何使用句点运算符来访问该结构的“.fd”成员呢?我们不应该使用 -> 运算符吗?
我在某处遗漏了一些东西。有人可以给我一个正确的方式来思考这个问题吗?
struct pollfd *pfds[]
是指向 struct pollfd
的指针。 (这是一个指针而不是数组,因为这是一个函数参数)
(*pfds)
是指向struct pollfd
的指针。这相当于pfds[0]
。
(*pfds)[*fd_count]
,相当于pfds[0][*fd_count]
,是一个struct pollfd
。使用点 .
运算符来访问 struct
的成员是很自然的。