C语言结构体元素赋值异常:readtable函数无法修改结构体元素
结构体数组修改不生效的问题排查与修复
问题根源分析
你的代码存在几个明确错误,直接导致readtable函数无法正确修改结构体数组:
传参错误
main函数调用readtable时传入的是tableptr,但你定义的结构体数组变量名是table——tableptr是未定义变量,编译器会抛出警告/错误。这直接导致函数没拿到正确的数组指针,自然无法修改原数组内容。遍历逻辑疏漏
- 第一个循环从
i=1开始,跳过了索引0的元素,无法检查table[0]的fd是否匹配传入值,也会漏掉索引0的空位。 - 寻找空位的循环
while (ptrtable[j].fd != 0)没有限制j < 100,数组满时会越界访问,引发未定义行为。 - 找到空位后仅设置
fd,未初始化ptr为NULL,后续判断ptrtable[i].ptr != 0时可能因野指针出错。
- 第一个循环从
修正后的代码
修正main函数的调用
int main() { static struct fdtable table[100]; int i; table[0].fd = 5; table[1].fd = 6; table[0].ptr = strdup("Hello"); table[1].ptr = strdup("How do you do?"); printf("fd1: %i, ptr1: %s\n", table[0].fd, table[0].ptr); printf("fd2: %i, ptr2: %s\n", table[1].fd, table[1].ptr); printf("fd3: %i, ptr3: %s\n", table[2].fd, table[2].ptr); table[1].ptr = remaining(table[1].ptr); printf("fd2: %i, ptr2: %s\n", table[1].fd, table[1].ptr); // 修正传参:将tableptr改为table i = readtable(9, table); printf("fd3: %i, ptr3: %s, i: %i\n", table[2].fd, table[2].ptr, i); return (0); }
修正readtable函数
unsigned int readtable(int fd, struct fdtable *ptrtable) { unsigned int i; unsigned int j; if (fd == 0) return (0); // 从索引0开始遍历,覆盖所有元素 i = 0; // 调整循环条件顺序,先判断边界防止越界 while (i < 100 && fd != ptrtable[i].fd && ptrtable[i].ptr != NULL) i++; if (i == 100) { j = 0; // 增加边界检查,避免越界 while (j < 100 && ptrtable[j].fd != 0) j++; // 确认找到有效空位再赋值 if (j < 100) { ptrtable[j].fd = fd; ptrtable[j].ptr = NULL; // 显式初始化指针,避免野指针 return (j); } else return 100; // 返回数组已满的标识 } else return (i); }
关键注意事项
- 结构体数组作为函数参数时,传递的是首元素指针,函数内的修改会直接作用于原数组,但前提是必须传对指针变量。
- 数组操作必须严格检查边界,越界访问会引发不可预测的未定义行为。
- 静态数组成员会被默认初始化(int为0,指针为NULL),但手动赋值时最好显式初始化所有成员,避免后续判断逻辑出错。
内容的提问来源于stack exchange,提问作者pandaero
相关产品推荐
相关产品推荐

