结构体大小怎么计算(结构体里放个char* 长度怎么计算)

本文目录
结构体里放个char* 长度怎么计算
char *a是一个指针,指针变量本身是一个int型,size为4。
所以结构体的大小为4*4=16字节。
注意:四个指针指向的数据是不在这个结构体内的。所以如果你想将其保存到文件中,不能简单fwrite结构体,要有一些特殊处理。实现方法有很多,我这里给出一个简单的:
int write_a(A *a)
{
int fd = open("a.file", O_CREAT|O_WRONLY|O_TRUNC);
write_string(fd, a-》a);
write_string(fd, a-》b);
write_string(fd, a-》c);
write_string(fd, a-》d);
close(fd);
return 0;
}
int write_string(int fd, char *p)
{
int len = 0;
if (p == NULL)
{
len = 0;
write(fd, (void*)&len, sizeof(int));
}
else
{
len = strlen(p) + 1;
write(fd, (void*)&len, sizeof(int));
write(fd, (void*)p, len);
}
return 0;
}
int read_a(A *a)
{
char buff;
int fd = open("a.file", O_RDONLY);
read_string(fd, &(a-》a));
read_string(fd, &(a-》b));
read_string(fd, &(a-》c));
read_string(fd, &(a-》d));
close(fd);
return 0;
}
int read_string(int fd, char **p)
{
int len = 0;
read(fd, (void*)&len, sizeof(int));
if (len == 0)
{
*p = NULL;
}
else
{
*p = (char*)malloc(len);
read(fd, (void*)*p, len);
}
return 0;
}
注意:仅仅是一个简单的示例,内存释放、错误处理等都没有考虑。
C语言,如何求已经使用了的结构体的大小
这个一般说来有两种办法:
1)初始化数组并给全部元素赋初值为0(或其它指定值),以后用元素值来判定此元素是否已经使用
2)单独使用一个变量,用来记录已经使用的元素的数量(此种方法较为方便)。
C语言结构体所占用的字节数如何计算
结构体的数据类型的有点多我们就不啰嗦了,直接来看相同数据结构体的几种书写的格式吧。
格式一:
01.struct tagPhone
02.{
03. char A;
04. int B;
05. short C;
06.}Phone;
格式二:
01.struct tagPhone
02.{
03. char A;
04. short C;
05. int B;
06.}Phone2;
格式三:
01.struct tagPhone3
02.{
03. char A;
04. char B;
05. char C;
06.}Phone3;
我们都知道,char类型占用1个字节,int型占用4个字节,short类型占用2个字节,long占用8个,double占用16个;
那么我们可能会犯一个错误就是直接1+4+2=7,该结构体占用7个字节。这是错的。
以下我们简单分析下:
计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取决于结构体中最大基本类型的大小。
对格式一:
以int型占用4个来作为倍数,因为A占用一个字节后,B放不下,所以开辟新的单元,然后开辟新的单元放C,所以格式一占用的字节数为:3*4=12;
同理对于格式二,
A后面还有三个字节,足够C存放,所以C根着A后面存放,然后开辟新单元存放B数据。所以格式二占用的内存字节为2*4=8.
对于格式三:
上面结构计算大小,sizeof(Phone3) = 1 + 2 + 4 = 7, 其大小为结构体中个字段大小之和,这也是最节省空间的一种写法。
总结:
第一种写法,空间浪费严重,sizeof 计算大小与预期不一致,但是保持了每个字段的数据类型。这也是最常见的漫不经心的写法,一般人很容易这样写;
第三种写法,最节省空间的写法,也是使用 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语言中的结构体的大小如何计算
用sizeof这个操作符来确定你的程序的话如下int
size=sizeof(student);由于C语言会对自定义类型进行存储优化,可以实际大小比把结构体里的所有原子类型加起来要大,

更多文章:
ajax提交form表单数据到servlet(HTML与Servlet的连接)
2025年12月7日 10:30
批量转换ascii(如何把txt 批量从utf8转换为ascii,最好有工具)
2025年11月18日 04:30
postgresql 创建用户(postgresql如何用新创建的用户登录呢)
2026年1月28日 16:30
工程师一个月能赚多少钱(造价工程师一般月收入是多少 需求量大吗)
2026年7月4日 11:00
delphi led扩展屏显示开发(用DELPHI模拟LED屏下的那种文字特效怎么做)
2025年12月17日 14:30
download是什么意思可以删除吗(Download什么意思,Download的文件夹能删了吗,)
2026年7月27日 03:15
trousers后面单复数(The+trousers用不用三单)
2026年5月7日 03:00
linux是自由软件吗(Linux是自由软件,什么是自由软件,它包含哪些含义)
2026年4月14日 08:15
springmvc答辩问题(我的毕业设计是JSP+mysql+Tomcat搭建的一个管理系统,答辩老师问我是怎么设计的,我应该)
2025年11月16日 05:00















