我正在使用网络模拟器显示某些网络节点的地址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

最佳答案

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));

10-05 22:58
查看更多