C语言结构体数字被清零问题

C语言 按行读取一份配置文件过后,把所有有效行都保存在一个字符串结构体里面,然后进行读取操作。对port结构体赋值过后,再最macro结构体赋值。第二个for循环是为了提取带空格的字符串,按照代码打印出来,第二个for循环里面的结构体值都是正确的,但是第二个for循环结束后进行打印,结构体就会被部分置零。
将第二个for循环注释掉后不会出现这样的情况,其余地方没有对 _board_init_port_info结构体做操作

 memset(& _board_init_port_info.port_info, 0x00, sizeof( _board_init_port_info.port_info));
        
    for(i = _board_init_port_info.head_line; i < _board_init_port_info.end_line ; i++)
    {
        sscanf(_board_init_profile[i].profile, "%d %d %d %x %d %d %d %d", &index, &lport, &pport, &phyid, &chip_id, &port_type, &phy_type, &poe_type);
        _board_init_port_info.port_info[index].lport       = (UINT8)lport;
        _board_init_port_info.port_info[index].pport       = (UINT8)pport;
        _board_init_port_info.port_info[index].phyid       = (UINT8)phyid;
        _board_init_port_info.port_info[index].chip_id     = (BOARD_UTL_CHIP_ID_T)chip_id;
        _board_init_port_info.port_info[index].port_type   = (BOARD_UTL_PORT_TYPE_T)port_type;
        _board_init_port_info.port_info[index].phy_type    = (BOARD_UTL_PHY_TYPE_T)phy_type;
        _board_init_port_info.port_info[index].poe_type    = (BOOLEAN_T)poe_type;
        printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\n",lport, pport, phyid, chip_id, port_type, phy_type, poe_type);
    }

    int hex = 0;
    

    for(i = e_board_init_macro.head_line; i < e_board_init_macro.end_line; i++)
    {
        int len = strlen(_board_init_profile[i].profile);
        int isspace = 0;
        int j = 0;
        for (j = 0; j < len; j++) 
        {
            if (_board_init_profile[i].profile[len-1] == '\n')
            {
                _board_init_profile[i].profile[len-1] = '\0';
            }
            if (isspace == 0 && _board_init_profile[i].profile[j] == ' ') 
            { 
                _board_init_profile[i].profile[j] = '\0';
                isspace = 1;
                continue;
            }
            if (isspace == 1)
            {
                if (_board_init_profile[i].profile[j] != ' ')
                {
                    memcpy(_board_init_macro_info[i-e_board_init_macro.head_line].macro_info, _board_init_profile[i].profile+j
                            ,sizeof(_board_init_macro_info[i-e_board_init_macro.head_line].macro_info)); 
                    break;  
                }
            }
        }
        for(index = 1; index < 11; index++)
        printf("%x\t%x\t%x\t%d\t%d\t%d\t%d\n",_board_init_port_info.port_info[index].lport, _board_init_port_info.port_info[index].pport,
        _board_init_port_info.port_info[index].phyid, _board_init_port_info.port_info[index].chip_id, _board_init_port_info.port_info[index].port_type,
        _board_init_port_info.port_info[index].phy_type, _board_init_port_info.port_info[index].poe_type);
    }
        for(index= 1; index < 11; index++)
        printf("%x\t%x\t%x\t%d\t%d\t%d\t%d\n",_board_init_port_info.port_info[index].lport, _board_init_port_info.port_info[index].pport,
        _board_init_port_info.port_info[index].phyid, _board_init_port_info.port_info[index].chip_id, _board_init_port_info.port_info[index].port_type,
        _board_init_port_info.port_info[index].phy_type, _board_init_port_info.port_info[index].poe_type);

img


此为循环内打印结果 全部正确

img


第二次打印结果部分清零 部分数值变化

通过您提供的代码,我们可以发现在第二个 for 循环中,您使用了 memcpy 函数把一个字符串复制到了另一个字符串里面,由于您没有指定复制的字符串长度,所以 memcpy 函数会把整个源字符串复制到目标字符串中,包括源字符串的结束符 '\0'。

在这种情况下,如果源字符串的长度超过了目标字符串的容量,就会导致字符串覆盖,即源字符串的一部分会覆盖目标字符串的内容。这就是您所遇到的问题,在第二个 for 循环结束后,部分结构体成员被覆盖为 0 的原因。

为了解决这个问题,您可以在调用 memcpy 函数时,指定复制的字符串长度,以避免字符串覆盖。

例如,您可以更改如下代码:

memcpy(_board_init_macro_info[i-e_board_init_macro.head_line].macro_info, _board_init_profile[i].profile+j
        ,sizeof(_board_init_macro_info[i-e_board_init_macro.head_line].macro_info));

size_t len = strlen(_board_init_profile[i].profile + j);
memcpy(_board_init_macro_info[i-e_board_init_macro.head_line].macro_info, _board_init_profile[i].profile+j
        ,len + 1);

这样,在调用 memcpy 函数时,您就可以指定复制的字符串长度,从而避免字符串覆盖的问题。

但是第二个for循环结束后进行打印,结构体就会被部分置零====这里的结构体是port还是macro?

先把第二个for循环里面的memcpy 其它保持不变。删除试试看还错不错, 可能越界引起数据异常

C语言中对结构体或数组清零的最快方法
https://blog.csdn.net/Pwiling/article/details/47040963