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
相关产品推荐
相关产品推荐

