C语言 结构体中属性的偏移量计算
//计算结构体偏移量 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
//详解:对于offscfof()函数,
//(TYPE *)0这句的意思是将内存地址是0内存块转换成一个TYPE类型的指针
//那么此时0地址的指针的步长就是TYPE,
//(TYPE *)0)->MEMBER这句话是取TYPE结构体的MEMBER属性(注意此时TYPE结构体的指针的值是0)
//&((TYPE *)0)->MEMBER,&就是取地址的运算符,这句话的意思是取TYPE结构体的MEMBER属性的地址
//(size_t)就是强转成size_t类型,因为此时结构体的指针的值是0,强转成Int型,恰巧就是MEMBER在结构体的偏移量
#define offscfof(TYPE,MEMBER) ((size_t)&((TYPE *)0)->MEMBER) //详解:对于container_of()函数,
//offscfof(type,member)是该属性在结构体中的偏移量
//ptr是member属性在内存中的实际地址,为什么要将ptr强转成char *类型呢?
//这是由于指针加减的特殊性决定的 比如 (int *)ptr-1,指针会向上移动4个字节,(char *)ptr-1 指针会向上移动1个字节
//指针是有步长的,不能是简单的加减,偏移量就是偏移的字节数,所以强转成char *类型正好
#define container_of(ptr,type,member) (type *)((char *)ptr-offscfof(type,member)) typedef struct _student1{
int num;
char name[];
int pNext;
}Student1; void main(){
int res = ;
Student1 a;
res = (int)container_of(&a.pNext,Student1, pNext);
printf("Student1的地址%d\n", sizeof(a));
printf("Student1的地址%x\n",&a);
printf("Student1的地址%x\n", res);
system("pause");
}
C语言 结构体中属性的偏移量计算的更多相关文章
- 在C语言结构体中添加成员函数
我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...
- C语言 结构体中的成员域偏移量
//C语言中结构体中的成员域偏移量 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...
- C语言结构体中的函数指针
这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础 本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-in ...
- c语言结构体中的冒号的用法
结构体中常见的冒号的用法是表示位域. 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省 ...
- C语言 结构体中的零长度数组
/* C语言零长度数组大小和取值问题 */ #include <stdio.h> #include <stdlib.h> #include <string.h> s ...
- c语言结构体中的一个char数组怎么赋值?
目录 前景提示 这里的结构体处理的步骤 一.char数组类型的处理 二.char数组指针类型的处理 三.全部代码 1. char数组 2. char数组指针 结语 前景提示 定义一个结构体,结构体中有 ...
- C语言结构体中字符数组的问题
第一个程序 #include <stdio.h> #include <string.h> typedef struct student { char name[10]; int ...
- c语言结构体在内存中存储,字节对齐
注意: 出于效率的考虑,C语言引入了字节对齐机制,一般来说,不同的编译器字节对齐机制有所不同,但还是有以下3条通用准则: (1)结构体变量的大小能够被其最宽基本类型成员的大小所整除: (2)结构体每个 ...
- 关于C语言中结构体中的结构体成员导致的字节对齐问题
关于结构体的字节对齐是什么,就不赘述,再此附上一篇文章,介绍字节对齐:http://www.linuxsong.org/2010/09/c-byte-alignment/ 这里的结构体字节对齐的数据类 ...
随机推荐
- 初始block,关于定义的几个小题目
block的定义和C语言指针函数非常相似,就可以照着指针函数的方法去依葫芦画瓢就可以了 block中的^只是用来表示这是一个block对象,和函数指针中的*作用一样,只是一个标识符 下面有三个小例子来 ...
- 带删除的EditText
在安卓开发中EditText是比较常用的控件之一,那我们平常看到EditText填写了内容之后右边会出现一个删除的按钮,这样可以方便用户对其中文本清空操作,是非常人性化的,我们可以重写EditText ...
- OC中NSArray
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...
- response实现验证码图片
package com.zhangbz.response; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2 ...
- 用nginx-gridFS读取MongoDB的图片及文件(为什么你老是配不成功?)
最近在部署公司服务器的nginx + mongodb + gridfs环境: 搜索了N多文档,基本上都一样,期间遇到很多问题: 下面是整理的一份搭建文档: 摘要 nginx-gridfs是一个ngin ...
- 读书笔记——Windows环境下32位汇编语言程序设计(2)配置环境
一直想买本罗云彬的Win32汇编书,现在终于出典藏版了,就买了本,读一读,涨涨姿势. 我把笔记本光驱拆下来添加了个硬盘,现在想装回去发现坏了,所以守着CD盘,代码却用的是第三版的,这真是个悲剧啊. - ...
- PHP笔试题(转载)
整理了一份PHP高级工程师的笔试题,问题很全面.嗯,基本上这些题都答得不错,那么你应该可以胜任大部分互联网企业的PHP职位了.下面直接上题. 1. 基本知识点 HTTP协议中几个状态码的含义:503, ...
- IE6-9中tbody的innerHTML不能赋值bug
IE6-IE9中tbody的innerHTML不能赋值,重现代码如下 <!DOCTYPE html> <html> <head> <meta charset= ...
- 动手学习TCP:TCP连接建立与终止
TCP是一个面向连接的协议,任何一方在发送数据之前,都必须先在双方之间建立一条连接.所以,本文就主要看看TCP连接的建立和终止. 在开始介绍TCP连接之前,先来看看TCP数据包的首部,首部里面有很多重 ...
- TFSF边界条件
待续 %1D FDTD simulation with a simple absorbing boundary condition % and a TFSF boundary between hy[] ...