2 dolphin zhangting dolphin_zhangting 于 2014.10.04 14:44 提问

visual c++6.0 结构体占存字节的疑问
c

程序1:
#include

int main(void)
{
struct stu
{
double a;
int b;
}tex;

printf("%d  %d  %d \n", sizeof(stu),  sizeof(tex.a), sizeof(tex.b) );


return 0;

}

结果:16 8 4 //疑问:为什么 sizeof(stu) 不等于 sizeof(tex.a)和 sizeof(tex.b) 的和 12 , 而相差了4个字节?

程序2:
#include

int main(void)
{
struct stu
{
char c;
int b;
} tex;

printf("%d  %d  %d \n", sizeof(stu),  sizeof(tex.a), sizeof(tex.c) );


return 0;

}

结果:8 1 4 //疑问:相差3个字节 ?

2个回答

dolphin_zhangting
dolphin_zhangting   2014.10.04 14:48

楼主补充:头文件 添加了 stdio.h 这里没有显示出来

BillyThe
BillyThe   2014.10.04 22:35

嗨,
这两个问题应该属于内存对齐问题,这里是结构体对齐。

第二个问题中,char c占用1个字节,int b占用4个字节,int b要求4字节对齐,所以结构体变量实际占用的空间为1(c)+3(用于对齐访问)+4(b);

第一个问题有点复杂,根据上面的分析,double应该占用8个字节,int占4个字节,应该占用12字节;但是结构体对齐中还有一点是:结构体会按照内长度最大(这里是double)成员大小对齐,所以结构体实际占用空间为8+4+4(用于结构体8字节对齐);

PS:这些规则还与编译器编译规则有关,比如gcc中的#pragma pack(n)或__attribute__((packed));

希望能帮到你

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言 - 结构体所占字节数
在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐。       内存对齐的原因:       1)某些平台只能在特定的地
C语言计算结构体占用字节大小总数
在学习C语言的时候很多人可能遇到了和我同样的问题,就是无法正确计算出C语言结构体所占字节的总的大小。首先,在开始计算结构体占用字节大小之前,我们要先搞懂什么是结构体的对齐和补齐。为什么会有结构体的对齐与补齐。 CPU的数据传输方式: CPU的数据传输方式是一次传输2个(32位)或者8个(64位)字节的方式进行传输(根据总线条数来确定),这里我们以64位系统来举例,如果你声明一个变量占用8个字节
关于计算struct结构体占用空间
关于如何计算struct所占用空间的大小: 有人可能觉得不就是把结构体内所有变量所占空间加起来不就可以了吗?其实,这句话只对了一半,所有变量所占空间要加起来没错,但是机器为了更加容易的取出struct里面的数据,会将里面的变量所占空间进行对齐。这是以空间换时间的一种方式。 如何进行对齐呢? 首先,是每个变量的偏移量对齐,每一个变量相对于首地址的位置就是偏移量。例如: struct data
结构体所占空间大小的运算
在C/C++中我们常常会看到有求一个结构体的大小的情况,有时候我们就会想:不就是结构体中各个数据类型所占的空间加起来就行啦,那么事实上是不是这样呢?答案:不是滴。原因是:为了加快读写数据的速度,编译器就实现了数据对其的做法来为每一个结构体分配空间。 这里我只讲结构体中数据对其的一个要点:2倍。 2倍(本人自己总结的)是指有两个倍数要记住,第一就是结构中的各类型的倍数,第二就是结构体这个类型的倍
C语言结构体所占用的字节数如何计算
结构体的数据类型的有点多我们就不啰嗦了,直接来看相同数据结构体的几种书写的格式吧。   格式一:     01.struct tagPhone   02.{   03.     char   A;   04.     int    B;   05.     short  C;   06.}Phone;   格式二:   01.struct tagPhone   02.{   03.
关于计算结构体数组中字节数
2.结构体计算长度,如下:  #include #include struct student {   int num;   char name[20];   char sex;   float score;    };   main() { struct student stu_1, *p;     printf("steudent len is %d\
有趣的问题:空结构体的内存空间占用问题
2011-10-01 17:47:27 分类: 原文地址:有趣的问题:空结构体的占用空间问题 作者:GFree_Wind 本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。 作者:gfree.wind@gmail.com 博客:linux
结构体和枚举在内存中所占的实际大小
最近在面试中经常会遇到结构体在内存在所占字节的问题,本文总结如下:
C语言中结构体变量到底占多大空间
结构体是C语言中
Microsoft visual C++ 2010学习版中C语言基本数据类型所占字节大小(系统为64位win8.1)
使用sizeof函数分别测出各类型的字节大小: