<错误:无法访问结构中地址0x1处的内存>

问题描述

鉴于我具有填充nicInfo结构成员的函数

nicList()
{
    std::string num;
    std::string nic_name_command;
    nicInfo* nic = {};
        nic = new nicInfo[nic_numbers];
        for (int i = 0; i < nic_numbers; i++)
        {
            nic_name_command = "ls /sys/class/net | sed -n -s " + std::to_string(i+1) + "p";
            nic[i].name = sshObj->exec_ssh_command(nic_name_command);
        }

    return nic;
}

这是nicInfo


struct nicInfo 
{
    const char* name = {};
    const char* ipAddr;
};

例如,如果我有3个nic卡(nic_numbers = 3),则在调试后,nic [4] .name不为null或0。它具有以下内容+name 0x1 <error: Cannot access memory at address 0x1> const char *
我想像这样在while循环中打印名称

int i = 0 ;
while ((nic + i)->name )
    {
        printf("nic name : %s\n",(nic + i)->name);
        i++;

但是它在i = 4时崩溃,因为它的内容不为null。我该怎么办? (我的功能和结构在c ++中,而while循环在c中)

解决方法

循环

while ((nic + i)->name )
    {
        printf("nic name : %s\n",(nic + i)->name);
        i++;

超出您为nic分配的内存范围。这样做会导致不确定的行为

您需要使用for循环仅迭代您实际拥有的元素:

for (size_t i = 0; i < nic_numbers; ++i)
{
    // ...
}

这当然要求在循环中使用nic_numbers匹配分配内存时使用的nic_numbers。如果没有大小,则无法使用像您这样的条件来找到终点。您需要数组的实际大小。

我的建议是使用C ++编写一切,这样您就可以使用std::stringstd::vector<nicInfo>来代替,这将大大简化事情。


在旁注:对于任何指针p和索引i,表达式*(p + i) 精确地等于p[i]。对于您而言,这意味着(nic + i)->name等于nic[i].name。后者通常更容易阅读,而写起来却更少。