一道用 sizeof 求结构体所占大小的笔试题?求教

问题描述

一道用 sizeof 求结构体所占大小的笔试题?求教

下列程序,为什么输出的结果是 120?

 int main(int argc, char* argv[])
{
     union u_type
     {
         int i;
         double x;
         float f;
     };
     struct str_type
     {
         char str[100];
         union u_type u[2];
     };
     printf("%dn",sizeof(struct str_type));
}

解决方案

首先union u_type这个占用了8个字节
然后struct str_type会按8字节对齐
union u_type u[2];
这个有两个,占了16个字节
char str[100];
100+16,不能被8整除,系统会自动填充4个字节到120.
这样就可以整除

解决方案二:

首先你的系统是64位的,计算结构体大小时按8字节对齐。char str[100]占100字节,100%8=4,所以还需要补齐4字节,就是104.然后计算union u_type u[2],这里有两个联合,每个联合所占大小为8字节,加起来就是16.最后所有的加起来就是120了

解决方案三:

http://codepad.org/wtImL3XB
不同的编译器不同,用gcc在线编译,结果就是116

作为题目,根本这个题目就是错的。

解决方案四:

可能是因为你的操作系统是64位的吧。

解决方案五:

显然u_type是8byte,char 是1byte,那加起来应该116btye,但是要字节对其,结构体的大小要是最大成员长度的整数倍,所以就120了。

解决方案六:

个人推荐你看一篇文章:WinCE 下结构体占用空间的分析,其实不只是 WinCE,也包括 Windows 平台。
其中有一段注释:
// 结构体实际占用的空间大小与结构体中占用空间最大的成员有什么关系?

// 结论: 结构体的大小为结构体中占用字节最大的成员的倍数。

其中的示例你可以分析一下。

解决方案七:

sizeof计算的是字节数,前面的共同体只能同时存储其中的一种类型,应该是116

解决方案八:

联合体union u_type所占内存大小为成员变量中所占内存最大的,所以为8为字节;char数组占100字节,联合体数组占16字节;
因为结构体中最大的变量内存为联合体8个字节,所以结构体总体大小以8字节对齐,所以由原来的116变为120

解决方案九:

8*2+100补4字节=120

时间: 2024-12-03 10:06:27

一道用 sizeof 求结构体所占大小的笔试题?求教的相关文章

c语言-求大神,C语言求 结构体

问题描述 求大神,C语言求 结构体 有5个学生,每个学生的数据包括学号.姓名.3门课的成绩,从键盘输入5个学生的数据,要求输出3门课总平均成绩,以及最高分的学生的数据. 要求用一个input函数输入3个学生数据,用一个average函数求总平均分,用max函数找出最高分的学生数据,总平均分和最高分的学生数据都在主函数中输出. 写到这里,报错太多,写不下去了 解决方案 首先,你的student结构体定义了没有.你有没有定义全局的stu,造成了冲突. 然后,你函数是不是和库函数冲突,比如max,在标

结构体占用内存大小计算

问题描述 结构体占用内存大小计算 第一个我理解为 和 double对齐是16 第二个 是 4*3 = 12 第三个理解为 (1+7)+8= 16 第四个 8* 3 =24: 和运行的出来的结果完全不对啊,,看了好几篇 对齐的文章,,把文章示例抄过来运行都是错的.....感觉我这块理解有 严重误区啊 解决方案 看上去编译器像是4字节对齐,double占两个单位 4+8 4+4+4 4+8 4+8+4 解决方案二: 结构体占内存大小计算struct结构体占内存大小计算struct结构体占内存大小计算

struct-关于结构体指针malloc不够的问题,求教!

问题描述 关于结构体指针malloc不够的问题,求教! 定义了一个结构体类型: typedef struct _tag_str{ char * first; short second; }str ,*pstr; 然后再定义一个结构体 typedef struct _tag_str1{ pstr first; float second; }str1,*pstr1; 定义一个变量 pstr1 strr; 在对strr初始化:strr=(pstr1)malloc(sizeof(str1)), 这样其实

<转> 求结构体偏移

原文出处忘记了... 此宏很神奇 #define FIND(structTest,e) (size_t)&(((structTest*)0)->e)   struct test { int a; int b; char c; int d; }; size_t s = FIND(test,a); cout<<s<<endl;  //输出结构体偏移

求。net网站开发工作的笔试题

问题描述 最近准备要找.net网站开发工作.请大侠们提供一些最近自己的.net网站开发的笔试题..小弟在此感谢了. 解决方案 解决方案二:直接在百度搜asp.net面试题解决方案三:引用1楼yue547283947的回复: 直接在百度搜asp.net面试题 百度那些题现在还考吗?解决方案四:等下.我贴一份给你,很犀的解决方案五:我打印了一份...解决方案六:引用4楼yksyuan的回复: 我打印了一份...经典面试题 这么长,,有的看咯..解决方案七:哈哈.50多页..我看着挺好的.就打印了一份

详解C语言的结构体中成员变量偏移问题_C 语言

c语言中关于结构体的位置偏移原则简单,但经常忘记,做点笔记以是个记忆的好办法 原则有三个: a.结构体中的所有成员其首地址偏移量必须为器数据类型长度的整数被,其中第一个成员的首地址偏移量为0, 例如,若第二个成员类型为int,则其首地址偏移量必须为4的倍数,否则就要"首部填充":以此类推 b.结构体所占的总字节数即sizeof()函数返回的值必须是最大成员的长度的整数倍,否则要进行"末尾填充": c.若结构体A将结构体B作为其成员,则结构体B存储的首地址的偏移量必须

结构体字节对齐

在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列, 而不是简单地顺序排列,这就是内存对齐. 内存对齐的原因: 1)某些平台只能在特定的地址处访问特定类型的数据: 2)提高存取数据的速度.比如有的平台每次都是从偶地址处读取数据,对于一个int型的变量,若从偶地址

C语言结构体的对齐原则

Q:关于结构体的对齐,到底遵循什么原则? A:首先先不讨论结构体按多少字节对齐,先看看只以1字节对齐的情况: #include <stdio.h> #include <string.h> #define PRINT_D(intValue) printf(#intValue" is %d\n", (intValue)); #define OFFSET(struct,member) ((char *)&((struct *)0)->member - (

深入理解结构体中占位符的用法_C 语言

复制代码 代码如下: typedef union{    struct x{    char a1 : 2;    char b1 : 3;    char c1 : 3;    }x1;    char c;}my_un;int main(){    my_un a;    a.c = 100;    printf("%d/n",a.x1.c1);    printf("%d/n",sizeof(my_un));     return 0;} 输出结果:31即第一