老师,我这有一个关于结构体的初始化问题

来源:7-8 结构体的内存布局

mahsiaoko

2020-03-27

老师,您好!我最近在阅读一个C语言的源码,里面有一个结构体的初始化,

#include <stdio.h>
#include <stdbool.h>
int main() {
	unsigned char val[] = { 139,155,125,94,0,233,7,0,24,0,1,0,4,0,1,3,29,33,0,0 };
    
    typedef struct knot_db_val {
        void* data;
        unsigned long len;
    } knot_db_val_t;
    knot_db_val_t data = {
        val,20
    };
    struct entry_h
    {
        unsigned int time;     
        unsigned int ttl;       
        unsigned char rank : 6;   
        bool is_packet : 1;  
        bool has_optout : 1; 
        unsigned char _pad;   
        unsigned char data[];
    };
    const struct entry_h* eh=data.data;
	return 0;
} 

这一句话:

const struct entry_h* eh=data.data;

这个是怎么进行初始化的,我觉得应该是以数组中的0为分隔符,但是具体是怎么样的?老师能不能解答一下?我用visual studio跟踪了一下,发现没有具体的过程。谢谢!

图片描述
老师,您看我红线标出来的部分,包含了rank、is_packet、has_optout、_pad以及部分的unsigned char data[],不满足缺省对齐原则,我也没有设置什么让他连续分布,这个是为什么?

写回答

1回答

quickzhao

2020-03-27

以val[]中24的值为分界点,24前面6bit对应unsigned char rank,后面2个bit对应is_packet和has_optout,其他自己去推吧。

0
3
mahsiaoko
回复
quickzhao
谢谢老师!
2020-03-28
共3条回复

重学C++ ,重构你的C++知识体系

一部大片,一段历史,构建C++知识框架的同时重塑你的编程思维

3884 学习 · 1103 问题

查看课程