【C 语言】结构体 ( 结构体偏移量计算 | 代码示例 )

举报
韩曙亮 发表于 2022/01/13 23:03:11 2022/01/13
【摘要】 文章目录 一、结构体成员偏移量二、完整代码示例 一、结构体成员偏移量 获取 Student 结构体中 age 成员偏移量 有 ...





一、结构体成员偏移量



获取 Student 结构体中 age 成员偏移量 有 2 2 2 种写法 ;

  • 结构体样式 :
typedef struct Student
{
    char name[5];	// 0 ~ 4 字节
    int age;		// 5 ~ 8 字节
    char *address; // 9 ~ 12 字节
}Student;

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 0 内存空间 , 按照 Student 结构体内存类型 进行解析 , 可以求出结构体某个 成员 相对于 0 的偏移量 ;
int offset = (int)&(((Student *)0)->age)

  
 
  • 1
  • 先获取 结构体 成员 , 然后再取该成员的地址 ;
Student student = NULL;
int offset = (int)&(student->age);

  
 
  • 1
  • 2

上述两种获取 Student 结构体中 age 成员偏移量的方法是等效的 ;


结构体 成员的 偏移量 是可以直接 计算获取的 , 不管有没有实际的 结构体变量 ;


结构体变量 如果声明完成 , 那么结构体中的 成员 的内存 , 就已经分配好了 ;

如果知道了 结构体成员 的内存地址 , 可以根据该 结构体成员 的偏移量 , 计算出该结构体的 首地址 ;





二、完整代码示例



完整代码示例 :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/**
 * @brief The Student struct
 * 定义 结构体 数据类型 , 同时为该结构体类型声明 别名
 * 可以直接使用 别名 结构体变量名 声明结构体类型变量
 * 不需要在前面添加 struct 关键字
 */
typedef struct Student
{
    // 声明变量时 , 会自动分配这 5 字节内存
    // 赋值时 , 可以直接使用 = 赋值字符串
    char name[5];	// 0 ~ 4 字节
    int age;		// 5 ~ 8 字节

    // 声明变量时 , 只会为 4 字节指针分配内存
    // 具体的 字符串内存 需要额外使用 malloc 申请内存
    // 赋值时 , 必须使用 strcpy 函数 , 向堆内存赋值
    char *address; // 9 ~ 12 字节
}Student;

/**
 * @brief 主函数入口
 * @return
 */
int main()
{
    // 声明结构体变量
    Student s1;
    // 声明结构体指针
    Student *p = NULL;

    // 对指针进行算术运算时合法的
    p = p - 1;
    p = p + 10;

    // 给指针 p 设置合法地址
    p = NULL;

    // 获取 Student 结构体 age 成员偏移量
    int age_offset = (int)&(p->age);

    // 获取 Student 结构体 address 成员偏移量
    int address_offset = (int)&(((Student *)0)->address);

    printf("age_offset = %d, address_offset = %d\n", age_offset, address_offset);

    // 命令行不要退出
    system("pause");
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

执行结果 :

age_offset = 8, address_offset = 12
请按任意键继续. . .

  
 
  • 1
  • 2

在这里插入图片描述

文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。

原文链接:hanshuliang.blog.csdn.net/article/details/121688646

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。