结构体及结构体内存对齐讲解
发布日期:2021-05-19 16:31:16 浏览次数:13 分类:精选文章

本文共 1532 字,大约阅读时间需要 5 分钟。

结构体类型的声明与使用

1. 结构体类型的声明

结构体的基础知识

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

结构体声明语法

结构体的声明与常规变量类似,但需要使用 struct 关键字。结构与变量可以在同一条语句中定义。

struct tag {    member-list;} variable-list;

结构体的示例

// 描述一个学生struct Stu {    char name[20]; // 名字    int age;       // 年龄    char sex[5];   // 性别    char id[20];   // 学号} stu1, stu2; // 分号不能丢

匿名结构体类型

在结构体声明时,可以选择不为结构体定义标签,这种结构体称为匿名结构体类型。

// 匿名结构体类型struct {    int a;    char b;    float c;} x;struct {    int a;    char b;    float c;} a[20], *p;

上述两个匿名结构体在编译器中被当作不同的类型,直接使用结构体变量时会出错。


2. 结构体变量的定义与初始化

结构体变量定义

结构体变量可以与其类型声明在一起定义。

struct Point {    int x;    int y;} p1;     // 声明类型同时定义变量 p1struct Point p2; // 定义结构体变量 p2

结构体初始化

可以在定义时为结构体变量赋值。

struct Point p3 = {   // 初始化    x, y};// 嵌套结构体初始化struct Node {    int data;    struct Point p;    struct Node* next;} n1 = {    10,    {  // 点 p 的初始化        4,        5    },    NULL};

3. 结构体内存对齐

结构体对齐规则

  • 结构体的第一个成员放在地址偏移量为 0 的位置。
  • 其他成员按照对齐数(默认为 8 字节)的倍数对齐。
  • 结构体的总大小为所有成员所占地址的最大值。
  • 嵌套结构体对齐方式与上层结构体相同。
  • 结构体内存对齐示例

    // 结构体对齐示例struct S1 {    char c1;    int i;    char c2;} p1; // 偏移 0struct S2 {    char c1;    char c2;    int i;} p2; // 偏移 8// 结构体嵌套示例struct S4 {    char c1;    struct S2 s2;    double d;} p4;

    4. 结构体传参

    结构体传递方式

    可以通过两种方式传递结构体:

    // 传值方式void print1(struct S s) {    printf("%d\n", s.num);}// 传地址方式void print2(struct S* ps) {    printf("%d\n", ps->num);}

    传递方式优劣比较

    • 传值方式:适合结构体较小的情况。
    • 传地址方式:减少函数调用的开销适合结构体较大的情况。
    int main() {    // 结构体传参    struct S s = {        { 1, 2, 3, 4 },        1000    };    print1(s);    print2(&s);    return 0;}

    建议传输结构体时采用传地址方式,因其效率更高。

    上一篇:位段 + 枚举 + 联合体讲解
    下一篇:leetcode 常考链表面试题总结

    发表评论

    最新留言

    很好
    [***.229.124.182]2025年05月04日 02时39分35秒