C语言-结构体和内存对齐

        在C语言中,结构体(Structures)是一种用户自定义的数据类型,允许将不同类型的数据组合成一个单独的单元。结构体允许程序员将相关数据组织在一起,以便更方便地管理和操作。本文将详细介绍C语言中结构体的相关内容,包括定义、访问、内存对齐等方面。

结构体的定义和基本用法

在C语言中,结构体的定义使用 struct 关键字,如下所示:

#include <stdio.h>

// 定义一个结构体
struct Person {
    char name[50];
    int age;
    float height;
};

int main() {
    // 声明一个结构体变量
    struct Person person1;

    // 访问结构体成员并赋值
    strcpy(person1.name, "John Doe");
    person1.age = 30;
    person1.height = 1.75;

    // 输出结构体成员的值
    printf("Name: %s\n", person1.name);
    printf("Age: %d\n", person1.age);
    printf("Height: %.2f meters\n", person1.height);

    return 0;
}

结构体内存对齐(Alignment)

结构体在内存中存储时,会按照一定的对齐规则进行存放,这被称为结构体的内存对齐(Alignment)。结构体的内存对齐是为了提高存取效率和处理速度,通常会将结构体成员按照某种规则排列在内存中。

内存对齐的原则和规则
  1. 基本对齐原则

    • 结构体的每个成员变量的起始地址必须是其类型大小的整数倍。
    • 比如,char 类型通常占用1字节,int 类型通常占用4字节(32位系统),因此 int 类型的起始地址必须是4的倍数。
  2. 结构体的对齐规则

    • 结构体的对齐大小是结构体中最大成员大小的整数倍。
    • 结构体中每个成员的偏移量(offset)都是成员大小的整数倍。
    • 如果需要,编译器会在结构体成员之间插入填充字节(Padding)来保证对齐要求。
示例和说明

考虑以下结构体的定义:

struct Example {
    char a;    // 1字节
    int b;     // 4字节(在32位系统中)
    double c;  // 8字节
};

结构体 Example 的大小可以通过 sizeof(struct Example) 来获取。按照常见的对齐规则和内存布局,计算如下:

  • char a 占用 1 字节。
  • int b 在32位系统中占用 4 字节,因为 int 的对齐要求通常是 4 字节。
  • double c 占用 8 字节。

结构体 Example 的总大小是这些成员中占用空间最大的整数倍,即 8 字节(double 类型的大小)。

因此,sizeof(struct Example) 的结果为 16 字节。

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值