我正在使用网络模拟器显示某些网络节点的地址ip,但是我没有得到预期的结果。
我使用此功能显示IP地址:
void print_hex_src_adress(uint8_t *s, size_t len)
{
printf(" ID=");
for(int i=0; i< len; i++) {
printf("%02x", s[i]);
}
}
然后为了显示我放置的地址:
open_addr_t * myaddress;
myaddress = idmanager_getMyID(ADDR_64B);
print_hex_src_adress(myadress, 16);
但是我得到的结果不是预期的结果:
ID=02141592cc0000000400000093947ae2
预期结果是:
ID=02141592cc0000000400000000000000
答案 0 :(得分:1)
idmanager_getMyID
返回一个指向open_addr_t
类型的并集的指针。联合是一个足以容纳其可能包含的任何字段的对象。这并不意味着其中的所有数据都会被初始化。您正在请求ADDR_64B
,这意味着仅可能通过addr_64b
字段初始化联合的前64位或8个字节。
实际上发生的是,您正在调用未定义的行为,试图打印包含垃圾值的字节。好消息是您将不会遇到不允许使用的内存,因为联合至少为16个字节。您期望垃圾为零,但实际上是获取垃圾。您有两种选择:
打印您实际请求的字节:
print_hex_src_adress(myadress.addr_64b, sizeof(myadress.addr_64b));
使用sizeof
这样的习惯是一个好习惯。结构和联合可以在版本之间进行更改,但是这样编写可以使您的代码模式对这种更改具有鲁棒性。
请求您实际想要的字节:
myaddress = idmanager_getMyID(ADDR_128B);
打印时仍请参考正确的字段,并且不要过多地硬编码尺寸:
print_hex_src_adress(myadress.addr_128b, sizeof(myadress.addr_128b));