//计算结构体偏移量

#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语言 结构体中属性的偏移量计算的更多相关文章

  1. 在C语言结构体中添加成员函数

    我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...

  2. C语言 结构体中的成员域偏移量

    //C语言中结构体中的成员域偏移量 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...

  3. C语言结构体中的函数指针

      这篇文章简单的叙述一下函数指针在结构体中的应用,为后面的一系列文章打下基础 本文地址:http://www.cnblogs.com/archimedes/p/function-pointer-in ...

  4. c语言结构体中的冒号的用法

    结构体中常见的冒号的用法是表示位域. 有些信息在存储时,并不需要占用一个完整的字节,   而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1   两种状态,   用一位二进位即可.为了节省 ...

  5. C语言 结构体中的零长度数组

    /* C语言零长度数组大小和取值问题 */ #include <stdio.h> #include <stdlib.h> #include <string.h> s ...

  6. c语言结构体中的一个char数组怎么赋值?

    目录 前景提示 这里的结构体处理的步骤 一.char数组类型的处理 二.char数组指针类型的处理 三.全部代码 1. char数组 2. char数组指针 结语 前景提示 定义一个结构体,结构体中有 ...

  7. C语言结构体中字符数组的问题

    第一个程序 #include <stdio.h> #include <string.h> typedef struct student { char name[10]; int ...

  8. c语言结构体在内存中存储,字节对齐

    注意: 出于效率的考虑,C语言引入了字节对齐机制,一般来说,不同的编译器字节对齐机制有所不同,但还是有以下3条通用准则: (1)结构体变量的大小能够被其最宽基本类型成员的大小所整除: (2)结构体每个 ...

  9. 关于C语言中结构体中的结构体成员导致的字节对齐问题

    关于结构体的字节对齐是什么,就不赘述,再此附上一篇文章,介绍字节对齐:http://www.linuxsong.org/2010/09/c-byte-alignment/ 这里的结构体字节对齐的数据类 ...

随机推荐

  1. LayoutTransition实现显示、隐藏动画

    public class Main4Activity extends Activity { private TextView tv1; private Button button1; private ...

  2. iOS程序启动的过程及原理

    iOS程序启动的过程及原理 文字部分 先执行main函数,main内部会调用UIApplicationMain函数 UIApplicationMain函数里面做了什么事情??? 1> 创建UIA ...

  3. 由一个activity跳转到另一个activity

    定义一个按钮,当点击的时候跳转到另一个activity的界面 1.新建第二个activity 2.在第二个Java源码处继承第一个activity,导入 3.在source中复写Oncreat方法 4 ...

  4. 【mysql】关于临时表

    mysql官方的介绍 In some cases, the server creates internal temporary tables while processing queries. Suc ...

  5. 烂泥:【解决】Ubuntu下使用SSH连接centos系统很慢

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 这几天在Ubuntu下使用SSH连接centos系统,发现连接很慢.建议一个连接大约需要30s.很是坑爹,如下: 后来查询相关资料,发现这个是Ubunt ...

  6. (四) openwrt单个ipk编译过程

    Tags : Makefile 本周是成胖子每周一博的第五周. 更好的阅读体验,请点击这里 [TOC] 前言 前一篇博客中,我们已经知道整个openwrt的编译顺序,本文我们来探讨与开发者息息相关的单 ...

  7. table边框美化

    在<table>里面加代码就可以了. 效果1: <TABLE style="BORDER-RIGHT: #993333 3px dashed; BORDER-TOP: #9 ...

  8. windows上用netstat查看端口/进程占用

    windows上用netstat命令查看某个端口是否占用,被哪个进程所占用 1.查看端口的占用情况,获取进程的PID 命令: netstat -ano | findstr "<端口号& ...

  9. 20150912华为机考2之"输入一段字符串(英文),将每个单词首字母大写后输出"

    还有其他一些(隐性)要求(要不然无法通过测试): .如果首字母已经大写,则不用变 .不是英文字母的不变 e.g. Input: hello world! this is _Ljj speaking! ...

  10. NOIP2007 T2纪念品分组 解题报告-S.B.S.

    #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #inclu ...