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

C语言结构体元素赋值异常:readtable函数无法修改结构体元素

结构体数组修改不生效的问题排查与修复

问题根源分析

你的代码存在几个明确错误,直接导致readtable函数无法正确修改结构体数组:

  1. 传参错误
    main函数调用readtable时传入的是tableptr,但你定义的结构体数组变量名是table——tableptr是未定义变量,编译器会抛出警告/错误。这直接导致函数没拿到正确的数组指针,自然无法修改原数组内容。

  2. 遍历逻辑疏漏

    • 第一个循环从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:45:47