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
相关产品推荐
相关产品推荐

