zoukankan      html  css  js  c++  java
  • [转帖]查看结构体成员的大小和偏移地址的方法


    [原文: http://www.cnitblog.com/shosh/archive/2008/05/06/posizeOfStruct.html ]

    这个是不小心被我撞见的,看到#define宏定义比较特别,仔细看了一下,发现原来有如此作用(请不要怪我少见多怪哦)。
    自己编写一小程序试之,贴出代码与运行结果与大家共享。

    #include <stdio.h>
     
    #define PACKVALUE 4
    #pragma pack(push)
    #pragma pack(PACKVALUE)        
    typedef 
    struct
    {
            
    char sa;
            
    double sb;
            
    int sc;
    }
     innerS;
     
    typedef 
    struct
    {
            
    int a;
            
    char b;
            
    short c;
            innerS d[
    2];
    }
     testS;
     
    #pragma pack(pop)
     
    typedef unsigned 
    long dword;
     
    #define FSIZE(type, field) sizeof(((type*)0)->field)    //字段所占内存大小(字节)
    #define FPOS(type, field) ((dword) & ((type*)0)->field)   //字段在结构体中的偏移位置
     
    int main(void)
    {
            printf(
    "#pragma pack(%d):\nsizeof(char)=%d; sizeof(short)=%d; sizeof(int)=%d; sizeof(double)=%d\n\n",
                            PACKVALUE, 
    sizeof(char), sizeof(short), sizeof(int), sizeof(double));
     
            printf(
    "FSIZE = %d, FPOS = %d\n", FSIZE(testS, a), FPOS(testS, a));
            printf(
    "FSIZE = %d, FPOS = %d\n", FSIZE(testS, b), FPOS(testS, b));
            printf(
    "FSIZE = %d, FPOS = %d\n", FSIZE(testS, c), FPOS(testS, c));
            printf(
    "FSIZE = %d, FPOS = %d\n", FSIZE(testS, d), FPOS(testS, d));
            printf(
    "FSIZE = %d, FPOS = %d\n", FSIZE(testS, d[0]), FPOS(testS, d[0]));
            printf(
    "FSIZE = %d, FPOS = %d\n", FSIZE(testS, d[0].sa), FPOS(testS, d[0].sa));
            printf(
    "FSIZE = %d, FPOS = %d\n", FSIZE(testS, d[0].sb), FPOS(testS, d[0].sb));
            printf(
    "FSIZE = %d, FPOS = %d\n", FSIZE(testS, d[0].sc), FPOS(testS, d[0].sc));
            printf(
    "FSIZE = %d, FPOS = %d\n", FSIZE(testS, d[1]), FPOS(testS, d[1]));
            printf(
    "FSIZE = %d, FPOS = %d\n", FSIZE(testS, d[1].sa), FPOS(testS, d[1].sa));
            printf(
    "FSIZE = %d, FPOS = %d\n", FSIZE(testS, d[1].sb), FPOS(testS, d[1].sb));
            printf(
    "FSIZE = %d, FPOS = %d\n", FSIZE(testS, d[1].sc), FPOS(testS, d[1].sc));
            
    return 0;
    }
  • 相关阅读:
    没有内存,怎么还能跑程序呢
    风物长宜放眼量,人间正道是沧桑
    一篇文章带你「重新认识」线程上下文切换怎么玩儿
    一文带你怼明白进程和线程通信原理
    万字长文带你还原进程和线程
    这些操作系统的概念,保你没听过!
    什么叫操作系统啊 | 战术后仰
    你要问我应用层?我就和你扯扯扯
    面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他
    从这道字符串处理的难题,寻找解决复杂问题的套路
  • 原文地址:https://www.cnblogs.com/Andrewz/p/1186834.html
Copyright © 2011-2022 走看看