C语言面试基础2 结构体相关

结构体定义过程中的问题

  • 不使用typedef关键字,定义结构体变量使用时必须加上struct
//结构体定义
struct test{
int a;
char b;
};
...
//定义变量
struct test t = {5, 'a'}
  • 使用typedef关键字,typedef关键字的作用是起一个别名为test。所以定义结构体变量的时候不需要加上struct
//结构体定义
typedef struct test{
int a;
char b;
}test;
...
//定义变量
test t = {5, 'a'}

内存对齐的问题

内存对齐的原因:
  • 平台移植,不是所有的平台都能访问任意地址的内存数据。
  • 性能原因,以32位的操作系统为例,寻址方式是按4byte递增的。如果不采用内存对齐,有的变量需要读取两次。
内存对齐的算法:

先以4byte的方式偏移,最后的结果加到最大内存变量字节的倍数。
例如

typedef struct test3{
char a;
int b;
char c;
double d;
}test3;

先算出来是20,最大的是double为8,所以结果是24。

顺便总结一下32位系统和64位系统下,各类型变量所占的字计数。
捕获.PNG

结构体和类的区别

待总结...

联合体和结构体的区别

  • 结构体struct:每个成员数据拥有自己独立的内存,互不干涉,同时存在。遵循内存对齐原则。
  • 联合体union:联合体所有数据成员公用一块内存,所以只能存在一个数据成员。如果重新赋值那么前一个数据成员就不存在了,内存会被重写。
联合体有一个功能,判断平台的大小端。

大端:数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。
小端:数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。

联合体判断大小端的代码:

typedef union test{
    int a;
    char b;
}test;

int main(int argc, char *argv[])
{
    test t;
    t.a = 1; //0x0001
    if (t.b == 1)
    {
        printf("xiaoduan");
    }
    else
    {
        printf("daduan");
    }
    return 0;
}

你可能感兴趣的:(C语言面试基础2 结构体相关)