iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言结构体嵌套与对齐超详细讲解
  • 781
分享到

C语言结构体嵌套与对齐超详细讲解

摘要

目录嵌套结构体结构体内存对齐32位的操作系统64位的操作系统嵌套结构体 格式:typedef struct 结构体名 {struct 结构体名1 结构体变量名1;struct 结构体

嵌套结构体

格式:
typedef struct 结构体名 {
struct 结构体名1 结构体变量名1;
struct 结构体名2 *结构体指针变量名1;
}结构体别名_t;

定义结构体普通的变量,访问结构体中的成员:

结构体别名_t 普通结构体变量名;

普通结构体变量名.结构体变量名1.成员名;
普通结构体变量名.结构体指针变量名1->成员名;

定义结构体指针变量,访问结构体中的成员

结构体别名_t *结构体指针变量名;

结构体指针变量名->结构体变量名1.成员名;
结构体指针变量名->结构体指针变量名1->成员名;

总结,访问结构体中的成员时,具体使用.还是->,需要看当前的结构体变量的类型。

测试用例:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Person
{
    char *name;
    int age;
    char sex;
} Person_t;
typedef struct Student
{
    Person_t per;
    int score;
} Student_t;
typedef struct Teacher
{
    Person_t *per_p;
    int salary;
} Teacher_t;
int main(int arGC, const char *argv[])
{
    
    // 1. 定义结构体类型的变量
    Student_t stu1;
    // 2. 初始化结构体中的成员
    stu1.per.name = (char *)malloc(sizeof(char) * 20);
    if (stu1.per.name == NULL)
    {
        printf("malloc failed\n");
        return -1;
    }
    strcpy(stu1.per.name, "zhoukai");
    stu1.per.age = 18;
    stu1.per.sex = 'M';
    stu1.score = 99;
    printf("姓名:%s 年龄:%d 性别:%c 工资:%d\n",\
        stu1.per.name, stu1.per.age, stu1.per.sex, stu1.score);
    // 使用Teacher_t定义结构体指针类型的变量,使用malloc分配空间
    Teacher_t *t=(Teacher_t *)malloc(sizeof(Teacher_t));
    if(NULL==t)printf("malloc memory filed!\n");
    // 对Teacher_t类型中的per_p成员,使用malloc分配空间,
    t->per_p =(Person_t *)malloc(sizeof(Person_t));
    if(NULL==t->per_p)
    {
        printf("malloc memory filed!\n");
        return -1;
    }
    // 对Person_t中的name成员,使用malloc分配空间。
    t->per_p->name=(char *)malloc(sizeof(char)*20);
    if(NULL==t->per_p->name)
    {
        printf("malloc memory filed!\n");
        return -1;
    }
    // 分配堆区空间时,从外向内进行分配;释放空间时,从内向外分配空间。
    strcpy(t->per_p->name,"yao");
    t->per_p->age=10;
    t->per_p->sex='M';
    t->salary=100000;
    printf("姓名:%s 年龄:%d 性别:%c 工资:%d\n",\
        t->per_p->name,t->per_p->age, t->per_p->sex,t->salary);
    //释放空间
    free(t->per_p->name);
    t->per_p->name=NULL;
    free(t->per_p);
    t->per_p=NULL;
    free(t);
    t=NULL;
    return 0;
}

图解:

结构体内存对齐

32位的操作系统

结构体中成员内存对齐,只考虑基本的数据类型,不考虑构造类型,构造类型最终也是由基本类型构成。
1> 如果结构体中的成员最大的成员只占1个字节的空间,则结构体类型的大小为1的整数倍;
2> 如果结构体中的成员最大的成员只占2个字节的空间,则结构体类型的大小为2的整数倍;
3> 如果结构体中的成员最大的成员只占4/8个字节的空间,则结构体类型的大小为4的整数倍;
结构体中的成员的地址:
1> 如果结构体中的成员为char类型,此成员的地址是1的整数倍;
2> 如果结构体中的成员为short类型,此成员的地址是2的整数倍;
3> 如果结构体中的成员为int,long int, long long int, float, double 类型,
此成员的地址是4的整数倍;

编译成32位的可执行程序:

gcc ***.c -m32

测试:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//1> 如果结构体中的成员最大的成员只占1个字节的空间,则结构体类型的大小为1的整数倍;
typedef struct{
    char name[20];
    char sex;
    char age;
}A_t;
//2> 如果结构体中的成员最大的成员只占2个字节的空间,则结构体类型的大小为2的整数倍;
typedef struct{
    char name[20];
    short age;
    char sex;
            // 保留一个字节
}B_t;
typedef struct{
    char name[20];
    char sex;
            // 保留一个字节
    short age;
}C_t;
//3> 如果结构体中的成员最大的成员只占4/8个字节的空间,则结构体类型的大小为4的整数倍;
typedef struct{
    char name[20];
    char sex;
            // 保留三个字节
    int age;
}D_t;
typedef struct{
    char name[20];
    char sex;
            // 保留一个字节
    short score;
    int age;
}E_t;
typedef struct{
    char name[20];
    char sex;
            // 保留一个字节
    short score;
    long long int age;
}F_t;
typedef struct{
    char *name;
    char sex;   
            // 保留一个字节
    short score;
    long long int age;
}G_t;
typedef struct{
    char *name;
    char sex;   
            // 保留一个字节(不同类型的在同一行,不同的那个从后往前补!!!)
    short score;
    char salary; 
    long long int age;
}H_t;
int main(int argc, const char *argv[])
{
    
    printf("A_t type size=%d\n",sizeof(A_t));//22
    printf("B_t type size=%d\n",sizeof(B_t));//24
    printf("C_t type size=%d\n",sizeof(C_t));//24
    printf("D_t type size=%d\n",sizeof(D_t));//28
    printf("E_t type size=%d\n",sizeof(E_t));//28
    printf("F_t type size=%d\n",sizeof(F_t));//32
    printf("G_t type size=%d\n",sizeof(G_t));//16
    printf("H_t type size=%d\n",sizeof(H_t));//20
    printf("-----------G_t中成员的地址-----------\n");
    G_t g;
    printf("G_t成员 char *name 的地址%p\n",g.name);
    printf("G_t成员 char sex 的地址%p\n",&g.sex);
    printf("G_t成员 short score 的地址%p\n",&g.score);
    printf("G_t成员 long long int age 的地址%p\n",&g.age);
    printf("-----------H_t中成员的地址-----------\n");
    H_t h;
    printf("H_t成员 char *name 的地址%p\n",h.name);
    printf("H_t成员 char sex 的地址%p\n",&h.sex);
    printf("H_t成员 short score 的地址%p\n",&h.score);
    printf("H_t成员 char salary 的地址%p\n",&h.salary);
    printf("H_t成员 long long int age 的地址%p\n",&h.age);
    return 0;
}

64位的操作系统

结构体中成员内存对齐,只考虑基本的数据类型,不考虑构造类型,构造类型最终也是由基本类型构成。
1> 如果结构体中的成员最大的成员只占1个字节的空间,则结构体类型的大小为1的整数倍;
2> 如果结构体中的成员最大的成员只占2个字节的空间,则结构体类型的大小为2的整数倍;
3> 如果结构体中的成员最大的成员只占4个字节的空间,则结构体类型的大小为4的整数倍;
4> 如果结构体中的成员最大的成员只占8个字节的空间,则结构体类型的大小为8的整数倍;
结构体中的成员的地址:
1> 如果结构体中的成员为char类型,此成员的地址是1的整数倍;
2> 如果结构体中的成员为short类型,此成员的地址是2的整数倍;
3> 如果结构体中的成员为int,float类型,
此成员的地址是4的整数倍;
4> 如果结构体中的成员为long int, long long int, double 类型,
此成员的地址是8的整数倍;
编译成64位的可执行程序:
8的整数倍;

结构体中的成员的地址:
1> 如果结构体中的成员为char类型,此成员的地址是1的整数倍;
2> 如果结构体中的成员为short类型,此成员的地址是2的整数倍;
3> 如果结构体中的成员为int,float类型,
此成员的地址是4的整数倍;
4> 如果结构体中的成员为long int, long long int, double 类型,
此成员的地址是8的整数倍;
编译成64位的可执行程序:
gcc ***.c

到此这篇关于C语言结构体嵌套与对齐超详细讲解的文章就介绍到这了,更多相关C语言结构体嵌套内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言结构体嵌套与对齐超详细讲解

本文链接: https://www.lsjlt.com/news/175881.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言结构体嵌套与对齐超详细讲解
    目录嵌套结构体结构体内存对齐32位的操作系统64位的操作系统嵌套结构体 格式:typedef struct 结构体名 {struct 结构体名1 结构体变量名1;struct 结构体...
    99+
    2022-12-26
    C语言结构体嵌套 C语言结构体对齐 C语言结构体嵌套与对齐
  • C语言结构体超详细讲解
    目录前言1、结构体的声明1.1 结构的基础知识1.2 结构的声明1.3 结构成员的类型1.4 结构体变量的定义和初始化2、结构体成员的访问2.1 点操作符访问2.2 ->操作符...
    99+
    2024-04-02
  • C语言超详细讲解指针与结构体
    目录本节目标初识指针1、内存与地址2、变量的地址3、指针变量4、指针的使用5、指针变量的大小初识结构体1、什么是结构体2、结构体的定义3、结构体的使用本节目标 理解内存与地址的相关概...
    99+
    2024-04-02
  • C语言 struct结构体超详细讲解
    目录一、本章重点二、创建结构体三、typedef与结构体的渊源四、匿名结构体五、结构体大小六、结构体指针七、其他一、本章重点 创建结构体typedef与结构体的渊源匿名结构体结构体大...
    99+
    2024-04-02
  • C语言超详细讲解结构体与联合体的使用
    目录结构体offsetof-宏位段枚举联合体(共用体)结构体 结构体内存对齐问题: 当我们在计算结构体的大小时,我们便需要清楚的知道结构体内存对齐是什么。 存在内存对齐的原因可细分为...
    99+
    2024-04-02
  • C语言结构体内存对齐详解
    目录实例一:分析:存储结构图如下实例二: 分析:存储结构如下实例三:  分析:存储结构如下 实例四:分析:存储结构图如下总结1、结构体内存对齐...
    99+
    2024-04-02
  • C语言深入回顾讲解结构体对齐
    目录结构体对齐问题结构体嵌套结构体强制内存对齐拓展求结构体成员的偏移量结构体对齐问题 1、知识点的引入: struct data1 { char a;//1B int...
    99+
    2024-04-02
  • C语言结构体(struct)的详细讲解
    目录引言1. 动态内存管理2. 结构体2.1 定义语法2.2 定义示例2.3 初始化2.4 结构体赋值2.5 结构体数组2.6 结构体指针赋值3. 学生管理系统附:结构体变量的存储原...
    99+
    2024-04-02
  • C语言详细分析结构体的内存对齐
    目录一.结构体二.结构体内存对齐1.非嵌套结构体的大小2.含嵌套结构体的大小三.为什么要内存对齐1.平台原因(移植原因)2.性能原因一.结构体 结构体 (struct)是一种数据结构...
    99+
    2024-04-02
  • C语言中结构体的内存对齐规则讲解
    目录1.结构体的内存对齐规则2.例子3.为什么存在内存对齐4.如何修改默认对齐数1.结构体的内存对齐规则 1.第一个成员在与结构体变量偏移量为0的地址处。 2.其他成员变量都放在对齐...
    99+
    2024-04-02
  • C语言热门考点结构体与内存对齐详解
    目录一、引例二、小试牛刀三、嵌套结构体的特殊情况四、关于为什么存在内存对齐1.平台原因(移植原因): 2.性能原因: 总结一、引例 到底什么是结构体内存对齐,我们用一段代码来介绍一下...
    99+
    2024-04-02
  • C语言 - 结构体、结构体数组、结构体指针和结构体嵌套
    结构体的意义 问题:学籍管理需要每个学生的下列数据:学号、姓名、性别、年龄、分数,请用 C 语言程序存储并处理一组学生的学籍。 单个学生学籍的数据结构: 学号(num): int 型姓名(name) :char [ ] 型性别(sex):c...
    99+
    2023-08-30
    c语言 开发语言
  • C语言详细分析结构体的内存对齐规则
    目录引例结构体内存对齐规则那么为什么要有内存对齐呢如何优化修改默认对齐数结构体的内存对齐是一个特别热门的知识点! 引例 #include<iostream> using ...
    99+
    2024-04-02
  • C语言详解结构体的内存对齐与大小计算
    目录结构体的内存对齐1、计算结构体的大小2、结构体的对齐规则3、为什么存在内存对齐?4、总结结构体的内存对齐 1、计算结构体的大小 struct S1 { char c1; // ...
    99+
    2024-04-02
  • C语言中结构体与内存对齐实例解析
    1.结构体类型 C语言中的2种类型:原生类型和自定义类型,结构体类型是一种自定义类型。 2.结构体使用时先定义结构体类型再用类型定义变量 -> 结构体定义时需要先定义结构体类型...
    99+
    2024-04-02
  • C语言中结构体怎么与内存对齐
    本篇内容介绍了“C语言中结构体怎么与内存对齐”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.结构体类型C语言中的2种类型:原生类型和自定义...
    99+
    2023-06-20
  • C语言详解热门考点结构体内存对齐
    目录一、为什么存在内存对齐二、如何计算?(考点)三、手撕代码一、为什么存在内存对齐         大...
    99+
    2024-04-02
  • C语言程序中结构体的内存对齐详解
    目录一、为什么存在内存对齐二、结构体的内存对齐四规则三、举例一、为什么存在内存对齐 1.平台原因(移植原因): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某...
    99+
    2022-11-13
    C语言结构体内存对齐 C语言 内存对齐 C语言 结构体
  • C语言数据结构超详细讲解单向链表
    目录1.链表概况1.1 链表的概念及结构1.2 链表的分类2. 单向链表的实现2.1 SList.h(头文件的汇总,函数的声明)2.2 SList.c(函数的具体实现逻辑)2.2.1...
    99+
    2024-04-02
  • C语言中结构体struct怎么对齐
    这篇文章主要介绍“C语言中结构体struct怎么对齐”,在日常操作中,相信很多人在C语言中结构体struct怎么对齐问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言中结构...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作