在一个64位的操作系统中定义如下的结构体:
struct st_task
{
uint16_t id;
uint32_t value;
uint64_t timestamp;
};
同时定义fool函数如下:
void fool()
{
st_task task = {};
uint64_t a = 0x00010001;
memcpy(&task, &a, sizeof(uint64_t));
printf("%11u,%11u,%11u", task.id, task.value, task.timestamp);
}
上述fool()程序的执行结果为?
我们从上面的结构体看到st_task这个结构体共16个字节(id:4个字节(其中后两个字节是为了内存对齐,里面是空的),value:4个字节,timestamp:8个字节)。
然后fool函数中,a是8个字节。接下来memcpy函数将a这8字节拷贝给task这个结构体
由于id是两个字节(后两个字节是为了内存对齐用的),所以最后结果是1,0,0