Q1. 结构体成员内存占用情况?

字节对齐规则:

  1. 结构体大小为结构体内成员大小最大值的整数倍;
  2. 结构体成员大小为当前成员相对于首地址偏移量的整数倍;

链接好文:

https://blog.csdn.net/qq_45303986/article/details/124210119

Q2. 结构体与联合体比较?

结构体定义:

用户自定义的可用的数据类型,允许存储不同类型的数据,结构体内成员按定义先后顺序存放;

联合体定义:

联合(共同)体是一种特殊的数据类型,允许在相同的内存位置存储不同数据类型的数据(但不同时),可以通过不同成员访问不同的存储空间;

其中,联合体所占内存大小为空间内最大内存成员的内存大小,联合体成员占用同一个内存空间;

typedef union _union_memory_t
{
    uint16_t    a;
    uint8_t     b;
    uint32_t    c;
    uint8_t     d;
    uint32_t    e;
}union_memory_t;
 
union_memory_t union_memory =
{
    .a = 0x55,
};
 
int main(void)
{
    uint8_t * point = NULL;
    sizeof(union_memory_t);
 
    printf("union_memory_t a = %d\n", union_memory.a);
    printf("union_memory_t b = %d\n", union_memory.b);
    printf("union_memory_t c = %d\n", union_memory.c);
    printf("union_memory_t d = %d\n", union_memory.d);
    printf("union_memory_t e = %d\n", union_memory.e);
 
    return 0;
}
Terminal Result:
union_memory_t a = 85
union_memory_t b = 85
union_memory_t c = 85
union_memory_t d = 85
union_memory_t e = 85

链接好文:

https://blog.csdn.net/qq_46731045/article/details/125822597

Q3. 指针占用几个字节?

指针概念:

是C语言中的一种数据类型,是一个值为内存地址的变量(或数据对象)。

指针使用:

指针的值是它所指向对象的地址;

在指针前面使用*运算符可以得到该指针所指向对象的值;

指针加1,指针的值递增它所指向类型的大小(以字节为单位);

字节占用:

不同CPU架构指针变量所占用的存储单元长度不同,比如32/64位系统,指针所占用的字节数分别为4和8字节;

int main(void)
{
    uint8_t * point = NULL;
    uint8_t data = 0x55;
    point = &data;
 
    printf("point sizeof = %d", sizeof(point));
    return 0;
}
Terminal Result:
point sizeof = 8