`
CalvinMnakor
  • 浏览: 52356 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

写一个宏获得一个结构体某成员的偏移量

阅读更多

在南京超然科技笔试中遇到的一道题,当时没写出来:


摘自

 

 

测试代码如下:(偏移量为内存存储实际的偏移量

#include <stdio.h>
#define offsetof(type,member) ((size_t)  &((type *)0)->member)

struct ops
{
	char c1;
	char c2;
	int i1;
	int i2;
	int i3;
	char c3;
};

int main()
{	
	struct ops  _test_type;
	printf("sizeof ops:%d\n",sizeof(_test_type));
	printf("members offset are:%d\t%d\t%d\t%d\n",offsetof(struct ops,c1),
		offsetof(struct ops,c2),offsetof(struct ops,i1),
		offsetof(struct ops,c3));
	return 0;	
	
}
 
分享到:
评论

相关推荐

    结构体偏移.docx

    1. 使用`offsetof`宏:这是C标准库提供的,它接受结构体类型和成员名称,返回成员的偏移量。例如,`offsetof(struct node_t, c)`将返回5。 2. 自行计算:通过获取成员变量的地址然后减去结构体的起始地址来计算。...

    C语言中结构体偏移及结构体成员变量访问方式的问题讨论

    c语言结构体偏移 示例1 我们先来定义一下需求: 已知结构体类型定义如下: ...如果你对c语言的库函数比较熟悉的话,那么你第一个想到的肯定是offsetof函数(其实只是个宏而已,先姑且这样叫着吧),我们man 3 offset

    高手笔记 结构成员变量偏移量的两个应用

    `BASE_OFFSET`宏通过将一个特定的内存地址(在这里是0x10000000)转换为指定基类的指针,然后减去这个地址,得到基类指针相对于内存地址的偏移量。这提供了基类接口在接口表中的偏移。 `COMPOSITE_OFFSET`则更复杂...

    详解C语言的结构体中成员变量偏移问题

    第一个成员的偏移量为0。 - 总字节数对齐:结构体的总大小必须是其最大成员长度的整数倍,以确保内存的高效利用。 - 内嵌结构体对齐:如果结构体A包含结构体B,B的起始地址也要满足对齐规则,即B中最大成员长度的...

    得到一个field在结构体中的偏移量

    下面是一个简单的测试程序,用于演示如何使用上面的宏定义来获取结构体中field的偏移量: ```c #include typedef struct student { int a; /* 占4个字节 */ char b; /* 占1个字节 */ short c; /* 占2个字节 */...

    结构体中的偏移1

    在C语言中,`offsetof`宏是一个非常重要的工具,它被用于计算结构体或联合体中某个成员相对于结构体或联合体起始位置的偏移量。这个偏移量通常以字节为单位,返回的结果类型是`size_t`。`offsetof`宏的引入使得...

    字节对齐与结构体大小

    2. 每个成员的偏移量应该是其自身大小的整数倍,如果有需要,编译器会在成员之间插入填充字节。 3. 结构体的总大小应该是最大成员数据类型大小的整数倍,同样,如果需要,编译器会在最后一个成员后面添加填充字节。 ...

    file_operations结构体解析.doc

    几乎所有时间中,它被简单初始化为 THIS_MODULE,一个在内核中定义的宏。 2. loff_t (*llseek) (struct file *filp, loff_t p, int orig); 该成员是一个指向 llseek 函数的指针。llseek 方法用作改变文件中的当前...

    编译器数据对齐方式(结构体、类所占空间的计算)

    例如,`#pragma pack(1)`会改变默认的对齐参数为1,这会使得结构体成员之间的填充字节被去除,从而使sizeof(A)和sizeof(B)的值均为6。 此外,当一个结构体中没有任何成员,即为空结构体时,不同编译器可能会有不同...

    深度剖析C语言结构体

    offsetof宏是C语言中一个非常重要的宏,用于计算结构体成员变量的偏移量。例如: ```c #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)-&gt;MEMBER) ``` 这里,offsetof宏将TYPE结构体的MEMBER成员变量的偏移量...

    Linux下的两个经典宏定义.docx

    `offsetof`宏的主要作用是计算一个结构体成员相对于结构体起始位置的偏移量。它的定义如下: ```c #define offsetof(TYPE, MEMBER) ((size_t) ((TYPE *)0)- MEMBER) ``` 这个宏的工作原理是: - `(TYPE *)0`...

    C 语言宏定义技巧 PDF

    为了获得结构体中某成员所占用的字节数,可以使用以下宏定义: ```c #define FSIZ(type, field) sizeof(((type*)0)-&gt;field) ``` 此宏接受结构体类型和成员名作为参数,并返回该成员所占的字节数。 #### 7. 将两个...

    关于C语言----六:结构体

    可以通过`offsetof`宏获取成员在结构体中的偏移量,了解内存布局。 八、结构体拷贝 直接赋值或使用`memcpy`函数可以实现结构体的拷贝,但要注意浅拷贝和深拷贝的区别,避免数据错误。 总结,C语言中的结构体是...

    宏定义的技巧

    与获取偏移量类似,有时还需要知道结构体成员的大小。这可以通过以下宏定义来实现: ```c #define FSIZ(type, field) sizeof(((type*)0)-&gt;field) ``` `FSIZ` 宏定义返回的是指定类型 `type` 的结构体中成员 `field...

    C语言之struct大小、首地址与内存对齐[借鉴].pdf

    这个宏将结构体的首地址强制转换成unsigned long类型,并将其作为结构体成员的偏移量的计算基准。 在main函数中,我们首先打印了结构体的首地址,然后计算了结构体成员dd相对于结构体首地址的偏移量,并将其打印...

    c语言宏定义技巧,常用宏定义方法

    与获取偏移量类似,我们也可以通过宏定义来获取结构体成员的大小: ```c #define FSIZ(type, field) sizeof(((type*)0)-&gt;field) ``` 这个宏同样接受两个参数,并使用`sizeof`运算符计算出成员的实际大小。 #### ...

    C语言常用宏定义技巧

    5. 结构体成员的偏移量:`FPOS(type, field)`宏计算结构体`type`中成员`field`的偏移量。它将结构体指针强制转换为`dword`类型,并取其地址,从而得到偏移量。这在需要知道结构体内部布局时非常有用。 6. 结构体...

    C语言宏定义使用技巧.pdf

    在结构体操作中,宏定义可以用来获取结构体成员的偏移量和大小。FPOS 和 FSIZ 宏就是这样的例子。FPOS 宏使用强制类型转换和指针来获取给定类型和成员的地址偏移量,而 FSIZ 宏则返回成员的大小。这些宏在处理与硬件...

Global site tag (gtag.js) - Google Analytics