首页 > 其他分享 >【C语言】宏offsetof的模拟实现(计算结构体中某变量相对于首地址的偏移)

【C语言】宏offsetof的模拟实现(计算结构体中某变量相对于首地址的偏移)

时间:2024-06-10 14:59:45浏览次数:10  
标签:struct int C语言 Stu 体中 printf offsetof OFFSETOF 于首

首先我们应该特别留意 : offsetof 是一个宏,并非是一个函数 !
宏offsetof的介绍:
在这里插入图片描述
参数:第一个是结构体类型名称,第二个是结构体成员名
返回类型:size_t无符号整形

引用的头文件:<stddef.h>

offsetof的使用举列 :

#include <stddef.h>
struct Stu // 注释为相对于起始位置的偏移量
{
	int a;//0~3
	char c;//4
	//5~7
	double d;//8~15
};
int main()
{
	printf("%d\n", sizeof(struct Stu));
	printf("%d\n", offsetof(struct Stu, a));
	printf("%d\n", offsetof(struct Stu, c));
	printf("%d\n", offsetof(struct Stu, d));
	return 0;
}

在这里插入图片描述

offsetof的模拟实现 :

#include <stddef.h>
//写一个宏,计算结构体中某变量相对于首地址的偏移,并给出说明
struct Stu
{
	int a;//0~3
	char c;//4
	//5~7
	double d;//8~15
};
 
#define OFFSETOF(struct_type, mem_name)      (int)&(((struct_type*)0)->mem_name)
 
 
int main()
{
	printf("%d\n", OFFSETOF(struct Stu, a));
	printf("%d\n", OFFSETOF(struct Stu, c));
	printf("%d\n", OFFSETOF(struct Stu, d));
	return 0;
}

在这里插入图片描述
实现详解 :
在这里插入图片描述
我们假设结构体起始地址就是0,这样其成员的地址取出来再强制类型转换为int便可以表示结构体中某个成员相对于起始位置的偏移量,这是一种很巧妙的思考方式,即可实现宏 offsetof 的模拟实现。

标签:struct,int,C语言,Stu,体中,printf,offsetof,OFFSETOF,于首
From: https://blog.csdn.net/m0_46676283/article/details/139576080

相关文章

  • C语言——使用函数创建动态内存
    一、堆和栈的区别1)栈(Stack):栈是一种自动分配和释放内存的数据结构,存储函数的参数值、局部变量的值等。栈的特点是后进先出,即最后进入的数据最先出来,类似于我们堆盘子一样。栈的大小和生命周期是由系统自动管理的,不需要程序员手动释放。2)堆(Heap):堆是由程序员手动分配和释......
  • 初始C语言——结构化算法的结构
    C语言程序是一种程序化程序,也就是说,可以用C语言程序来解决的问题,都可以分解成相互独立的几个部分,每个部分都可以通过简单的语句或结构来实现。一般而言,对于结构化的程序,一个完整的算法可以用“顺序结构”,“分支结构”和“循环结构”的有机组合来表示。(一)----------顺序结构......
  • 实验6 C语言结构体、枚举应用编程
    4.实验任务41#include<stdio.h>2#defineN1034typedefstruct{5charisbn[20];6charname[80];7charauthor[80];8doublesales_price;9intsales_count;10}Book;1112voidoutput(Bookx[],int);13voidsort(Bo......
  • 【C语言从入门到入土】第四章数组
    第四章数组———————-数组的引入你所有的压力,都是因为你太想要了,你所有的痛苦,都是因为你太较真了。有些事不能尽你意,就是在提醒你改转弯了。如果事事都如意,那就不叫生活了,珍惜所有不期而遇,看淡所有的不辞而别。文章目录第四章数组4.1如何定义一个数组1.相同......
  • c语言基础篇A
    A1.程序和程序设计语言程序程序=算法+数据结构+程序设计方法+语言工具和环境数据结构:数据的类型和数据的组织形式算法:对数据操作的方法和步骤程序设计语言的种类第一代语言:机器语言第二代语言:汇编语言第三代语言:高级语言——面向过程语言——面向对象语言第四代语言:非......
  • c语言基础篇B
    B1.数据的输入与输出c语言本身不提供输入输出语句,输入和输出操作是由c函数库中的函数来实现的在使用系统库函数时,要用预编译命令“#include”将有关的“头文件”包括到用户源文件中include"stdio.h"或者includeB2.printf()函数(格式输出函数)函数作用:输出若干个任意类型的数......
  • 零基础非科班也能掌握的C语言知识19 动态内存管理
    动态内存管理1.为什么要有动态内存分配2.malloc和free2.1malloc2.2free3.calloc和realloc3.1calloc3.2realloc4.常见的动态内存的错误4.1对NULL指针的解引用操作4.2对动态开辟空间的越界访问4.3对非动态内存开辟的空间free4.4使用free释放⼀块动态开辟内存的⼀部分4......
  • 实验6 C语言结构体、枚举应用编程
    #defineN3//运行程序输入测试时,可以把这个数组改小一些输入测试#include<stdlib.h>typedefstructstudent{intid;//学号charname[20];//姓名charsubject[20];//考试科目doubleperf;//平时成绩......
  • 数据结构严蔚敏版精简版-线性表以及c语言代码实现
    线性表、栈、队列、串和数组都属于线性结构。线性结构的基本特点是除第一个元素无直接前驱,最后一个元素无直接后继之外,其他每个数据元素都有一个前驱和后继。1 线性表的定义和特点如此类由n(n大于等于0)个数据特性相同的元素构成的有限序列称为线性表。线性表中元素的个数n定......
  • C语言数据类型和变量
    1.数据类型介绍c语言提供了各种数据类型来描述生活中的各种数据。下面介绍一下c语言内置数据类型:1.1字符型char//charactersignedchar//有符号的unsignedchar//⽆符号的1.2整型//短整型shortintsignedshortintunsignedshortint//整型intsign......