Ⅰ c语言结构体所占用的字节数如何计算
结构体的数据类型的有点多我们就不啰嗦了,直接来看相同数据结构体的几种书写的格式吧。
格式一:
01.structtagPhone
02.{
03.charA;
04.intB;
05.shortC;
06.}Phone;
格式二:
01.structtagPhone
02.{
03.charA;
04.shortC;
05.intB;
06.}Phone2;
格式三:
01.structtagPhone3
02.{
03.charA;
04.charB[2];
05.charC[4];
06.}Phone3;
我们都知道,char类型占用1个字节,int型占用4个字节,short类型占用2个字节,long占用8个,double占用16个;
那么我们可能会犯一个错误就是直接1+4+2=7,该结构体占用7个字节。这是错的。
以下我们简单分析下:
计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取决于结构体中最大基本类型的大小。
对格式一:
上面结构计算大小,sizeof(Phone3) = 1 + 2 + 4 = 7, 其大小为结构体中个字段大小之和,这也是最节省空间的一种写法。
总结:
第一种写法,空间浪费严重,sizeof 计算大小与预期不一致,但是保持了每个字段的数据类型。这也是最常见的漫不经心的写法,一般人很容易这样写;
第三种写法,最节省空间的写法,也是使用 sizeof 求大小与预期一样的写法,但是全部使用字节类型,丢失了字段本生的数据类型,不方便使用;
第二种写法,介于第一种和第三种写法之间,其空间上比较紧凑,同时又保持了结构体中字段的数据类型。
只要了解是这些写法的差异性,可以视情况选用。
Ⅱ 关于C语言的结构体大小
看起来好像没啥问题,不过有一点还是要怀疑一下, 就是输出的a,a的格式符你用的%d ,这个不对, a是个结构体,可能不可以这样输出,你可以把a和对应的%d删掉试试看
Ⅲ C语言结构体变量的大小问题
还要考虑编译器优化的内存对齐
C语言标准本身没有要求结构体/联合体的成员间内存存储需要连续
编译器为了高效存取数据,牺牲部分内存空间,提高存取的效率
Ⅳ c语言问题,struct的大小
首先int的大小就和编译器有关.vc的话就是4
另外计算结构体大小的是以结构体中
**所占字节最大的变量的倍数**(或者说来对齐的)
简单点说,结构体大小就是其中变量所占大小的最小公倍数(这个数还必须大于所有变量所占大小的和)
你提问中c-1 i-4 f-4 d-8(我用vc)
公倍数是8,16,24,32...所有变量所占大小和是1+4+4+8=17
所以就是24了.
Ⅳ 关于C语言结构体类型的大小
这样才是你的结果
#pragma pack(1)
struct stu
{
}
#pragma pack()
Ⅵ C语言,结构体数组的长度
C语言不支持动态分配内存,你需要自己分配,大概这样
#include<stdio.h>
#include<stdlib.h>
typdef struct Node
{
int value;
int next;
}Node;
int main()
{
int a;
scanf("%d",&a);
Node *p=malloc(a*sizeof(Node));
.......
}
这样p就相当于Node数组的第一个元素的指针,也可以当作数组名使用了。
Ⅶ C语言--结构体大小
这与编译器的编译选项有关,如果按C语言的本意则结果应为401,但很多编译器都对结构类型的成员变量进行了按4字节或8字节对齐,这样做可以提高数据存储速度,对齐后结构的大小就只能是4或8的整数倍。
Ⅷ C语言如何求结构体数组长度
sizeof可以求出单个结构体大小,还得乘以数组个数。
Ⅸ C语言结构体大小问题
量内存的起始地址的边界是跟它类型一致的
比如int类型,可以认为它存在4的倍数的地址,short存在2字节倍数开始的地址,char存在1字节开始的地址,即任意地址
因此,回过头来看
第一个结构
假设int a;///4字节倍数地
short b;//推理a的末尾是4字节倍数地址也是2字节倍数地址,所以b是挨着a存的
char c;//任意其实地址,挨着b存放
看起来7个字节就放下了,但是需要兼顾4字节对齐的原则,在末尾补了一个字节
第二个结构也类似
结构体与普通类型并无大区别,存储区域也一样的
Ⅹ C语言中一个结构体变量大小是选择题
明显 是 D
B是陷阱
具体原因是 编译器为了操作方便,会把大小不是 4 的倍数的结构体,
转化为 4 的倍数, 列如 53 转化为 56
你可以 自己试验
struct
{ int a
char b
}; 大小为 8