0

我希望将 timeval 字段附加到我的自定义数据包标头中。面临类型转换的问题。

我在标题中的自定义字段

struct pkthdr {
    uint64_t sec;
    uint64_t usec;
}

Linux timeval 结构

struct timeval {
    long tv_sec;        /* seconds */
    long tv_usec;   /* and microseconds */
}

初始化

struct pkthdr *hdr;
struct timeval *tm;
gettimeofday(&tm, 0);
hdr->sec = htonl(tm->tv_sec);
hdr->usec = htonl(tm->tv_usec);

以下行导致分段错误

hdr->sec = htonl(tm->tv_sec);
hdr->usec = htonl(tm->tv_usec);
4

1 回答 1

0

您已经创建了指向struct timevaland的指针struct pkthdr,但实际上并未分配任何要指向的内存,因此当您尝试将值分配给hdr->secand时,您正在调用未定义的行为hdr->usec

gettimeofday当您传入 astruct timeval **而不是 a时,您也传入了错误的类型struct timeval

相反,尝试创建实际的结构而不是指向它们的指针:

struct pkthdr hdr;
struct timeval tm;
gettimeofday(&tm, NULL);
hdr.sec = htonl(tm.tv_sec);
hdr.usec = htonl(tm.tv_usec);

检查以确保其中的数据hdr.sec实际上hdr.usec是您想要的,因为这可能不正确。我对使用 有一些保留,htonl因为它处理 32 位数据,而您的预期结果是 64 位。

于 2019-07-11T15:41:16.303 回答