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;
    }
  • 相关阅读:
    初识python 2.x与3.x 区别
    装饰器
    函数的进阶
    Spring Boot启动问题:Cannot determine embedded database driver class for database type NONE
    22.Spring Cloud Config安全保护
    23.Spring Cloud Bus 无法更新问题(踩坑) Spring cloud config server Could not fetch remote for master remote
    24.Spring Cloud之Spring Cloud Config及Spring Cloud Bus
    Spring Boot整合Spring Data Elasticsearch 踩坑
    项目中Spring Security 整合Spring Session实现记住我功能
    32.再谈SpringBoot文件上传
  • 原文地址:https://www.cnblogs.com/Andrewz/p/1186834.html
Copyright © 2011-2022 走看看