You need to enable JavaScript to run this app. Contiki-NG下字符格式IPv6地址转换为ip6addr时结果为空的问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Contiki-NG下字符格式IPv6地址转换为ip6addr时结果为空的问题求助

核心问题定位
  • 最直接的根因是你声明了未初始化的野指针addr_2
    代码里const uip_ip6addr_t *addr_2;仅创建了一个指针变量,没有为它分配可存储转换结果的有效内存空间。而uiplib_ip6addrconv()的作用是将字符串转换得到的二进制IPv6地址写入第二个参数指向的内存区域。你传入未初始化的野指针后,写入操作要么触发非法内存访问直接失败,要么随机写入了无关内存,后续读取该指针指向的内容自然是空值。
  • 第二个参数修饰不符合要求
    uiplib_ip6addrconv()需要修改指向的内存来存储结果,要求传入可写的uip_ip6addr_t实体地址,你用const修饰指针不符合函数参数约定,可能导致隐式转换异常、操作被拦截。
修正实现方案

先在栈上分配实际的地址结构体变量,再将变量的地址传入转换函数,同时可增加返回值校验转换结果:

int size = 40;
char *p;
p = strstr(str,"fe");
printf("%s\n", p);
// 直接分配栈上的uip_ip6addr_t实体,而非仅声明指针
uip_ip6addr_t addr_2;
// 传入实体的地址,去掉const修饰
int conv_ret = uiplib_ip6addrconv(p, &addr_2);
// 校验转换结果,避免后续使用无效地址
if(conv_ret == 0) {
    printf("地址字符串格式非法,转换失败\n");
}
额外排查点

如果修正指针问题后仍转换失败,可检查截取的p指向的字符串是否混入不可见字符:比如数据包负载截取时是否带了末尾换行符、空格、后续字段残留,可通过打印字符串长度校验,标准IPv6字符串最长为39个字符,加结束符共占40字节,正好匹配你代码里定义的size = 40的长度预期,若长度超出则说明截取存在多余字符。

内容的提问来源于stack exchange,提问作者Sara Sosh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.30 02:06:07