对结构体的进阶理解

📌结构体的自引用

  1. 错误想法:不要认为结构体的自引用就是结构体里套一个自己的结构体名

比如下面代码:

struct student
 {
    char name[20];
    int age;
    struct student;
 };

这种套娃是错的。

  1. 正确的做法应该是:套一个自己类型的那种指针

struct student
 {
    char name[20];
    int age;
    struct student* next;
 };

int main()
{
    struct student s1;
    struct student s2;
    s1.next = &s2;

    return 0;
}

📌结构体内存对齐

你有没有想过一个结构体要占多大的内存空间呢 ?

举个栗子吧:看下面的代码:

#include<stdio.h>

struct s1
{
    int a;
    char c;
};


int main()
{
    printf("%d\n", sizeof(struct s1));
    
    return 0;
}

你觉得会输出多少?

你大概会回答:5。 但这个答案是错的。为什么? 这就牵扯到结构体内存的对齐了;

实际上这些结构体的数据在内存中存放的时候是要完成内存的对齐的;

什么? 你问为什么要对齐? 原因就是:对齐了可以提高代码运行的效率,但对齐会浪费内存,这其实是一种以牺牲内存空间的做法来换取较高的效率;

那是怎么对齐的呢?

假设下面是一个内存块;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值