You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中如何正确索引struct pollfd指针数组?

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)++;
}
问题解析

你的核心误解出在对pfds参数类型的判断上——C语言里有个容易混淆的规则:函数参数中的数组声明会被自动退化为指针。

你以为struct pollfd *pfds[]是「struct pollfd指针的数组」,但实际上它等价于struct pollfd **pfds——也就是一个指向**struct pollfd类型数组**的指针,而非指针数组。

现在拆解(*pfds)[*fd_count].fd的逻辑:

  • *pfds:解引用这个指针,得到的是struct pollfd *(也就是目标数组的首地址,数组名本身会退化为指向第一个元素的指针)。
  • [*fd_count]:对这个指针做下标访问,等价于*( *pfds + *fd_count ),最终得到的是数组中第*fd_count个struct pollfd结构体实例(是实实在在的结构体对象,不是指针)。
  • 既然是结构体对象,自然用.运算符访问成员,而非指针用的->。

再结合代码里的realloc操作验证:sizeof(**pfds)计算的是struct pollfd的大小,因为**pfds是对指针两次解引用后拿到的struct pollfd类型对象,这也说明*pfds指向的是struct pollfd的数组,而非指针数组。

内容的提问来源于stack exchange,提问作者wrosen01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:15:20