㈠ 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语言计算结构体长度问题
struct tt;
{
int n1;char n2;float n3;//因为4字节对齐,这里是12个字节
union uu//这里是个union,所以里面的内容最大的,作为它的大小,所以是用int u1[2],占8个字节
{
int u1[2];char u2[2];
}su;
};
最后的结果,应该是12+8= 20
11是绝对不正确的。
值得注意的是,编译器有些可以设置对齐方式的,会影响结构体的大小
㈢ C语言中结构体数组长度怎么计算
结构体数组的长度计算方法和普通数组相同。
1、c语言中,定义数组后可以用sizeof命令获得数组的长度(即可容纳元素个数)。但是通过传递数组名参数到子函数中,以获得数组长度是不可行的,因为在子函数当中,数组名会退化为一个指针。
2、例如:
int
data[4],length;
length=sizeof(data)/sizeof(data[0]);
//数组占内存总空间除以单个元素占内存空间大小,即等于元素个数
printf("length
of
data[4]=%d",
length
);
//输出length
of
data[4]=4
㈣ C语言求结构体sizeof怎么求
sizeof()用来测给定的数据类型在内存中占的字节长度;
比如我想知道int类型变量占几个字节 就这样使用:len = sizeof(int) 就可以了,len就是int型变量在内存中字节数;
当然你也可以这么用 int a; len = sizeof(a); 编译器会知道a是int型变量的,会自动换成sizeof(int);
另外 自己定义的数据类型也可以用sizeof来求字节数,比如定义了一个类class A{...},然后你
这样用:len = sizeof(A),就能知道A占了几个字节;
最后,提示下,sizeof是关键字或者说是运算符,不是函数,它的结果是编译的时候就确定了的,没有函数调用;
㈤ 结构体类型的长度计算
计算方法:
运算符sizeof可以计算出给定类型的大小,对于32位系统来说,sizeof(char)
=
1;
sizeof(int)
=
4。基本数据类型的大小很好计算,我们来看一下如何计算构造数据类型的大小。
c语言中的构造数据类型有三种:数组、结构体和共用体。
数组是相同类型的元素的集合,只要会计算单个元素的大小,整个数组所占空间等于基础元素大小乘上元素的个数。
结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。看下面这样的一个结构体:
struct
stu1
{
int
i;
char
c;
int
j;
};
先介绍一个相关的概念——偏移量。偏移量指的是结构体变量中成员的地址和结构体变量地址的差。结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。显然,结构体变量中第一个成员的地址就是结构体变量的首地址。因此,第一个成员i的偏移量为0。第二个成员c的偏移量是第一个成员的偏移量加上第一个成员的大小(0+4),其值为4;第三个成员j的偏移量是第二个成员的偏移量加上第二个成员的大小(4+1),其值为5。
实际上,由于存储变量时地址对齐的要求,编译器在编译程序时会遵循两条原则:一、结构体变量中成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍)
二、结构体大小必须是所有成员大小的整数倍。
对照第一条,上面的例子中前两个成员的偏移量都满足要求,但第三个成员的偏移量为5,并不是自身(int)大小的整数倍。编译器在处理时会在第二个成员后面补上3个空字节,使得第三个成员的偏移量变成8。
对照第二条,结构体大小等于最后一个成员的偏移量加上其大小,上面的例子中计算出来的大小为12,满足要求。
再看一个满足第一条,不满足第二条的情况
struct
stu2
{
int
k;
short
t;
};
成员k的偏移量为0;成员t的偏移量为4,都不需要调整。但计算出来的大小为6,显然不是成员k大小的整数倍。因此,编译器会在成员t后面补上2个字节,使得结构体的大小变成8从而满足第二个要求。由此可见,大家在定义结构体类型时需要考虑到字节对齐的情况,不同的顺序会影响到结构体的大小。对比下面两种定义顺序
struct
stu3
{
char
c1;
int
i;
char
c2;
}
struct
stu4
{
char
c1;
char
c2;
int
i;
}
虽然结构体stu3和stu4中成员都一样,但sizeof(struct
stu3)的值为12而sizeof(struct
stu4)的值为8。
如果结构体中的成员又是另外一种结构体类型时应该怎么计算呢?只需把其展开即可。但有一点需要注意,展开后的结构体的第一个成员的偏移量应当是被展开的结构体中最大的成员的整数倍。看下面的例子:
struct
stu5
{
short
i;
struct
{
char
c;
int
j;
}
ss;
int
k;
}
结构体stu5的成员ss.c的偏移量应该是4,而不是2。整个结构体大小应该是16。
如何给结构体变量分配空间由编译器决定,以上情况针对的是linux下的gcc。其他平台的c编译器可能会有不同的处理。
㈥ C语言,结构体问题所占内在字节数,怎么算的
在c语言中如何计算结构体长度和共用体长度?
结构体的长度等于体内各个成员变量长度之后。如此题长度为字符串数组的长度加上两个int型变量的长度,再加上double长度,最后结果为10+2+2+8=22。解析:char 每个字符占一个字节(因为是一个十长度的字符数组)所以是10字节,int占两个字节,double占8个字节。所以最后是10+2*2+8=22。
共用体的长度是体内成员中最长的长度。如果一个共用体内最长长度为12字节,则共用体的长度就是12。
希望能够帮到你。如果还有什么问题在问?
㈦ C语言结构体变量的大小问题
还要考虑编译器优化的内存对齐
C语言标准本身没有要求结构体/联合体的成员间内存存储需要连续
编译器为了高效存取数据,牺牲部分内存空间,提高存取的效率
㈧ C语言中的结构体的大小如何计算
用sizeof这个操作符来确定
你的程序的话如下
int
size=sizeof(student);
由于C语言会对自定义类型进行存储优化,可以实际大小比把结构体里的所有原子类型加起来要大,
㈨ C++中结构体的大小
结构体(struct)的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。先看下面定义的两个结构体.
struct
{
char
a;
short
b;
char
c;
}S1;
struct
{
char
a;
char
b;
short
c;
}S2;
分别用程序测试得出sizeof(S1)=6
,
sizeof(S2)=4
可见,虽然两个结构体所含的元素相同,但因为其中存放的元素类型顺序不一样,所占字节也出现差异。这就是字节对齐原因。通过字节对齐,有助于加快计算机的取数速度,否则就得多花指令周期。
字节对齐原则
结构体默认的字节对齐一般满足三个准则:
1)
结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2)
结构体每个成员相对于结构体首地址的偏移量(offset,即每个成员的起始地址)都是成员自身大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal
adding);
3)
结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing
padding)。
注意:当结构体成员里面有数组成员时,如int
a[10],要看成10个整形变量才参与计算。
通过这三个原则,就不难理解上面两个struct的差异了.
对于struct
S1,
为了使short变量满足字节对其准则(2),
即其存储位置相对于结构体首地址的offset是自身大小(short占2个字节)的整数倍,必须在字节a后面填充一个字节以对齐;再由准则(3),为了
满足结构体总大小为short大小的整数倍,必须再在c后面填充一个字节。
对于struct
S2,
却不必如上所述的填充字节,因为其直接顺序存储已经满足了对齐准则。
如果将上面两个结构体中的short都改为int(占4个字节),
那么会怎么样呢?
程序得出sizeof(S1)=12,
sizeof(S2)=8
利用上面的准则,也不难计算得出这样的结果。S1中在a后面填充3个字节、在c后面填充3个字节,这样一共12个字节;S2中在a、b顺序存储之后填充两个字节用以对其,这样一共就8个字节。
当然,在某些时候也可以设置字节对齐方式。这就需要使用
#pragma
pack
。
#pragma
pack(push)
//压栈保存
#pragma
pack(1)//
设置1字节对齐
struct
{
char
a;
short
b;
char
c;
}S1;
#pragma
pack(pop)
//
恢复先前设置
如上所示,将对其方式设为1字节对齐,那么S1就不填充字节,sizeof为各元素所占字节之和即4。这一点在从外部2进制文件中读入struct大小的数据到struct中,是很有用的.
另外,还有如下的一种方式:
·
__attribute((aligned
(n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。
·
__attribute__
((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
㈩ C语言结构体及长度问题
a四字节对齐,所以应该是16
b是指针,就是4个字节
你那个答案是16位机器,现在上哪找去。。