如何解决<错误:无法访问结构中地址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::string
和std::vector<nicInfo>
来代替,这将大大简化事情。
在旁注:对于任何指针p
和索引i
,表达式*(p + i)
精确地等于p[i]
。对于您而言,这意味着(nic + i)->name
等于nic[i].name
。后者通常更容易阅读,而写起来却更少。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。