首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

请问一个结构体长度的有关问题

2013-01-01 
请教一个结构体长度的问题typedef struct _dcor{char a char b[8] char c[8] double n double e doub

请教一个结构体长度的问题
typedef struct _dcor
{
char a; 
char b[8]; 
char c[8]; 
double n; 
double e; 
double z; 
int d; 
int f; 
int g; 
}DD;
        sizeof(DD) = 64;

typedef struct _dcor
{
char a; 
char b[8]; 
char c[8]; 
int d; 
int f; 
int g; 
double n; 
double e; 
double z; 
}EE;
        sizeof(EE) = 56;

为什么两个结构体大小不一样呢? 用vs2005编译的




[解决办法]
好问题,请搜索“结构体 字节对齐”
[解决办法]
结构体对齐和字节对齐问题
[解决办法]
元素在自己宽度的整数倍位置存储
并且总长度会是结构体里面最长长度的整数倍,不够的话补空位


补充一点
如果有指针,无论什么类型指针都是四个字节长度
[解决办法]
字节对齐问题
[解决办法]
看看这个程序的输出楼主就明白了


/**
 * @file    demo.c
 * @brief   
 */

#include <stddef.h>
#include <stdio.h>

typedef struct _DD
{
    char a; 
    char b[8]; 
    char c[8]; 
    double n; 
    double e; 
    double z; 
    int d; 
    int f; 
    int g; 
}DD;

typedef struct _EE
{
    char a; 
    char b[8]; 
    char c[8]; 
    int d; 
    int f; 
    int g; 
    double n; 
    double e; 
    double z; 
}EE;

int main(int argc, char *argv[])
{
    printf("sizeof(DD)=%d\n", (int)sizeof(DD));
    printf("offsetof(DD, a)=%d\n", (int)offsetof(DD, a));
    printf("offsetof(DD, b)=%d\n", (int)offsetof(DD, b));
    printf("offsetof(DD, c)=%d\n", (int)offsetof(DD, c));
    printf("offsetof(DD, n)=%d\n", (int)offsetof(DD, n));
    printf("offsetof(DD, e)=%d\n", (int)offsetof(DD, e));
    printf("offsetof(DD, z)=%d\n", (int)offsetof(DD, z));
    printf("offsetof(DD, d)=%d\n", (int)offsetof(DD, d));
    printf("offsetof(DD, f)=%d\n", (int)offsetof(DD, f));
    printf("offsetof(DD, g)=%d\n", (int)offsetof(DD, g));

    printf("sizeof(EE)=%d\n", (int)sizeof(EE));
    printf("offsetof(EE, a)=%d\n", (int)offsetof(EE, a));
    printf("offsetof(EE, b)=%d\n", (int)offsetof(EE, b));


    printf("offsetof(EE, c)=%d\n", (int)offsetof(EE, c));
    printf("offsetof(EE, d)=%d\n", (int)offsetof(EE, d));
    printf("offsetof(EE, f)=%d\n", (int)offsetof(EE, f));
    printf("offsetof(EE, g)=%d\n", (int)offsetof(EE, g));
    printf("offsetof(EE, n)=%d\n", (int)offsetof(EE, n));
    printf("offsetof(EE, e)=%d\n", (int)offsetof(EE, e));
    printf("offsetof(EE, z)=%d\n", (int)offsetof(EE, z));

    return 0;
}


[解决办法]
vs系列默认对齐是8,这里最大数据宽度是8,按8字节对齐
[解决办法]
谷歌“内存对齐”,有很多很详细的介绍,是有三条规则的。
[解决办法]
结构体字节对齐,上面的都说过了。
另,这个大小还依赖于编译器的实现,VS2005和gcc得到的大小可能是有差别的。

热点排行