关于c语言中的结构体使用偏移量求值问题

最近在看nginx源码,看到定时器的时候,发现一个结构体利用偏移量求值问题,

结构体相信做c开发的都遇到过,那么不知你对结构体中成员变量偏移这块是如何理解的;

首先我们先看一下nginx中的那个让我迷惑的地方

ev =    (event_t*)((char*)node - offsetof(event_t, timer));

这里,可以得知道是利用event_t结构体的timer变量,来反求event_t结构体的地址

说明一下:

  event_t是一个结构体

  node 也是一个结构体

  timer 也是一个结构体,并且timer存在于event_t结构体内

如下:

  struct event_t{

    ...

    struct node timer;

    ...

  }

 这里,先是得到一个node,即struct node的一个对像,这个node就存在于event_t中

然后看下offsetof()这个函数, 这个函数的作用为取得变量在结构体中的偏移值;

struct node_t{
    char a;
    int b;
    int c;
};

offsetof(struct node_t, c);这个就可以得到c在结构体struct node_t中的偏移值同理:由于node已经获取取了。而timer也即node节点在event_t中的位置即为 offsetof(event_t, timer),而node在内存中的地址就可以通过timer的偏移量获取,

node - offsetof(event_t, timer),这样就得到了event的首地址,当然也就是要使用的event首地址。

关于c语言中的结构体使用偏移量求值问题,布布扣,bubuko.com

时间: 2024-10-14 11:17:17

关于c语言中的结构体使用偏移量求值问题的相关文章

C语言中的结构体,结构体数组

C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存对齐的问题.也就是内存里面会有空档. 1.结构体的定义和赋值 结构体是可以直接初始化的,在定义的时候,就可以初始化,而且如果你的结构体中恰好有字符数组的话,这个时候初始化是不错的选择,原因很简单,字符数组只能定义的时候直接初始化 后来就不可以了,后来你就只能用strcpy函数来拷贝初始化了. str

C语言中的结构体和C++中的结构体以及C++中类的区别

c++中结构体可以定义一个函数 C中的结构体和C++中结构体的不同之处:在C中的结构体只能自定义数据类型,结构体中不允许有函数,而C++中的结构体可以加入成员函数. C++中的结构体和类的异同: 一.相同之处:结构体中可以包含函数:也可以定义public.private.protected数据成员:定义了结构体之后,可以用结构体名来创建对象.但C中的结构体不允许有函数:也就是说在C++当中,结构体中可以有成员变量,可以有成员函数,可以从别的类继承,也可以被别的类继承,可以有虚函数. 二.不同之处

c语言中的结构体指针类型的cast

1.我们在c语言中会经常碰到强制类型转换. 在这,我介绍一种结构pointer类型转换,但是有前提(有点类似于c++中的继承中的子父对象的cast). 简单的介绍一下: 首先我们要知道一个结构的指针,并且 在这个结构体中,第一个结构成员必须也是一个结构体(最好是结构体类型). 那么我们可以这个结构体指针转换为指向这个结构体中第一个成员结构体的指针. 直接看代码: ************************************ /* struct transform for struct

C语言中改变结构体的对齐方式

C语言中默认是以结构体中最长的数据类型为对齐标准如 typedef struct _NODE { short a; int b; char c; }NODE; 会以int,即4字节为对齐标准,此时sizeof(NODE)=12 可以使用#pragma pack(n)改变对齐方式.编译器会从“n”和”结构体中最长的数据类型长度“中选较小的那个作为对齐标准 如#pragma pack(1),相关于取消对齐,1B对齐,此时sizeof(NODE)=7

C语言中的结构体是怎么定义的_怎么使用?

结构体的定义 // 定义结构体st struct st{ int a; // 成员a int b; // 成员b }; #include <stdio.h> struct st{ int a; int b; }; int main() { struct st sst; // 通过.来访问结构体中的值 sst.a = 10; sst.b = 20; printf ("struct content is : %d, %d\n", sst.a, sst.b); return 0;

C语言中访问结构体成员时用‘.’和‘-&gt;’的区别

举个例子,定义了一个叫Student,别名为stu的结构类型,我们声明了一个结构体变量叫stu1,声明了一个结构体指针为stuP. typedef struct Student { char name[N]; int id; int score; struct Student *next; } stu; stu stu1; stu* stuP; 那么我们访问他们的结构体成员时要这样 stu1.name="Xiao Ming"; stu1.id=2015211; stuP->nam

黑马程序员--C语言中的结构体

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 结构(struct)      结构是由基本数据类型构成的.并用一个标识符来命名的各种变量的组合.  结构中可以使用不同的数据类型.      1. 结构说明和结构变量定义      在Turbo C中, 结构也是一种数据类型, 可以使用结构变量, 因此,  象其它  类型的变量一样, 在使用结构变量时要先对其定义.      定义结构变量的一般格式为:       struct 结构名   

ANSI C中取得结构体字段偏移量的常用方法

来自http://blog.chinaunix.net/u2/62910/showart_492571.html 假设在ANSI C程序中定义了一个名为MyStruct的结构类型,其中有一个名为MyField的字段,如何取得它在结构体中的偏移? typedef struct MyStruct_tag{  // some fields  ... long MyField; // other fields  ...} MyStruct; 最容易想到的方法应该与如下代码差不多: size_t GetO

c语言中的结构体为值类型,当把一个结构体赋值给另一个结构体时,为值传递

#include <stdio.h> int main() { struct person { int age; }; struct person p1 = {19}; //值传递,将p1中所有成员变量的值赋值个p2中对应的成员变量 struct person p2=p1; //改变p1的成员变量的值,不会影响p2中对应成员变量的值 p1.age = 20; printf("p1.age=%d\n",p1.age); printf("p2.age=%d\n&quo