C 语言中同意将值为 0 的变量强制转换成任一类型的指针,转换结果是一个NULL指针. (type*)0 // 一个 type 类型的NULL指针 用这个指针訪问结构体内的成员是非法的,可是 &(((type*)0)->field) 是为了计算 field 的地址 ,编译器不会产生訪问 field 的代码.仅仅会依据 type 的布局和起始地址在编译期计算这个地址(常量).而又由于初始地址为 0,故该地址的值就是该结构体成员相对于结构体基址的偏移. (size_t)&(((type*…
IPv4套接字地址结构通常也称为“网际套接字地址结构”,它以sockaddr_in命名,定义在<netinet/in.h>头文件中. struct in_addr { in_addr_t s_addr;/*32-bit IPv4 address*/ /*network byte ordered*/ }; struct sockaddr_in { uint8_t sin_len;/*length if structure(16)*/ sa_family_t sin_family;/*AF_INE…
看nginx代码时发现双链表使用的是这种方法,记录一下 给出一个实例来说明 struct father_t {    int a;    char *b;    double c;}f;char *ptr = &(f.b);//而不是 ptr = f.b; 这里ptr是b的地址,而不是它指向的地址. 根据C语言对struct类型的存储特性,我们可以画这么一个图示:通过分析图示,我们可以看出,我们只需要把当前知道的成员变量的地址ptr,减去它在结构体当中相对偏移4就的到了结构体的地址(ptr-4)…
首先我们要更正一个很熟悉的概念,那就是指针不仅仅是“地址”,指针还有一个很重要的特性,那就是“类型”. 指针初始化时,“=”的右操作数; 除外,该语句表示指针为空): 所以 ; 这样的代码是不允许的.在C++里面直接是error的,即使在一些C编译器中以warning的形式提示,但是warning有的时候也很严重.所以这种东西不要用.从const int到int*是不存在隐士转换的. 正确的使用方法是 ; 这样就先使10这个地址增加一个类型,然后在赋值给int *p.看这句话的汇编: 00401…
#define list_entry(ptr, type, member) container_of(ptr, type, member) 在进行编程的时候,我们经常在知道结构体地址的情况下,寻找其中某个成员的地址:但是知道了成员的地址,如果找到这个结构体对应的地址呢? Linux内核中,获取节点地址的函数是list_entry(),它的宏定义如上所示. 我们再来查找container_of(ptr, type, member)的定义,发现它依然是一个宏定义: #define container…
倘若你查看过Linux Kernel的源码,那么你对 offsetof 和 container_of 这两个宏应该不陌生.这两个宏最初是极客写出的,后来在Linux内核中被推广使用. 1. offsetof 1.1 offsetof介绍 定义:offsetof在linux内核的include/linux/stddef.h中定义.#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 说明:获得结构体(TYPE)的变量成员(…
在C语言编程中,有时候需要知道某结构体中某成员的大小,比如使用堆内存来存储结构体中的某成员时,需要知道该成员的大小,才好确定所需申请的空间大小.求某结构体中某成员的大小,你会怎么做? 例子: typedef struct { char a; char c; short b; int d; char e; }test_struct; 求 d 成员所占内存空间的大小. 方法一 萌新尝试法... 我们可以先定义一个结构体变量,然后再使用sizeof求出. #include <stdio.h> typ…
这几天在看王艳平的<windows 程序设计>,第5章讲解了MFC框架是怎么管理窗口句柄到窗口实例之间的映射,用到了两个类CPlex和CMapPtrToPtr,用于管理内存分配的类(避免因为大量地.频繁地创建窗口对象导致内存碎片的产生).CMapPtrToPtr类用到了关联结构体 CAssoc,其中有好多对指针类型的转换,感觉对结构体了解不够.特别是成员的对齐方式,跟我猜测的完全不同,花了点时间搞清楚了.在跟朋友一起吃饭还有时间,就顺手写下来,供大家参考: 首先明白几个概念: 1.结构体成员的…
这几天在看王艳平的<windows 程序设计>,第5章讲解了MFC框架是怎么管理窗口句柄到窗口实例之间的映射,用到了两个类CPlex和CMapPtrToPtr,用于管理内存分配的类(避免因为大量地.频繁地创建窗口对象导致内存碎片的产生).CMapPtrToPtr类用到了关联结构体 CAssoc,其中有好多对指针类型的转换,感觉对结构体了解不够.特别是成员的对齐方式,跟我猜测的完全不同,花了点时间搞清楚了.在跟朋友一起吃饭还有时间,就顺手写下来,供大家参考: 首先明白几个概念: 1.结构体成员的…
0 前言 此篇文章想写如何通过工具手查导出表.PE文件代码编程过程中的原理.文笔不是很好,内容也是查阅了很多的资料后整合出来的.希望借此加深对PE文件格式的理解,也希望可以对看雪论坛有所贡献.因为了解PE文件格式知识点对于逆向破解还是病毒分析都是很重要的,且基于对PE文件格式的深入理解还可以延伸出更多非常有意思的攻防思维. 1 导出表查询工具 1 ) dumpbin VS自带的工具,有很多的功能.但用来查询程序的导出表也非常方便,使用例子如下: dumpbin.exe /EXPORTS D:\P…