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

2025-07-02 17:00:01 :3

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

各位老铁们好,相信很多人对结构体大小怎么计算都不是特别的了解,因此呢,今天就来为大家分享下关于结构体大小怎么计算以及结构体里放个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语言会对自定义类型进行存储优化,可以实际大小比把结构体里的所有原子类型加起来要大,

关于结构体大小怎么计算和结构体里放个char* 长度怎么计算的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

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

本文编辑:admin

更多文章:


代码零九那年的(零九社区邮编是多少)

代码零九那年的(零九社区邮编是多少)

本篇文章给大家谈谈代码零九那年的,以及零九社区邮编是多少对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录零九社区邮编是多少J是代表那年生产的汽车车架号第十位是L那年的车车辆识别代码怎么看那一年生产的交通违章代码1902怎么处罚

2025年9月28日 07:00

只学c语言能找工作吗(C语言学了之后好找工作吗)

只学c语言能找工作吗(C语言学了之后好找工作吗)

大家好,今天小编来为大家解答以下的问题,关于只学c语言能找工作吗,C语言学了之后好找工作吗这个很多人还不知道,现在让我们一起来看看吧!本文目录C语言学了之后好找工作吗现在编程学c语言出去找工作还有用吗只会C语言能找到工作吗只会c语言不会c+

2026年1月19日 08:00

欧洲最强rapper潮水免费看(欧美最厉害rapper)

欧洲最强rapper潮水免费看(欧美最厉害rapper)

大家好,关于欧洲最强rapper潮水免费看很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于欧美最厉害rapper的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

2026年8月7日 12:45

ajax提交form表单数据到servlet(HTML与Servlet的连接)

ajax提交form表单数据到servlet(HTML与Servlet的连接)

各位老铁们,大家好,今天由我来为大家分享ajax提交form表单数据到servlet,以及HTML与Servlet的连接的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面

2025年12月7日 10:30

批量转换ascii(如何把txt 批量从utf8转换为ascii,最好有工具)

批量转换ascii(如何把txt 批量从utf8转换为ascii,最好有工具)

今天给各位分享如何把txt 批量从utf8转换为ascii,最好有工具的知识,其中也会对如何把txt 批量从utf8转换为ascii,最好有工具进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录如何把txt 批量

2025年11月18日 04:30

severest(serve的最高级是什么)

severest(serve的最高级是什么)

大家好,severest相信很多的网友都不是很明白,包括serve的最高级是什么也是一样,不过没有关系,接下来就来为大家分享关于severest和serve的最高级是什么的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!本

2026年2月11日 19:15

postgresql 创建用户(postgresql如何用新创建的用户登录呢)

postgresql 创建用户(postgresql如何用新创建的用户登录呢)

大家好,postgresql 创建用户相信很多的网友都不是很明白,包括postgresql如何用新创建的用户登录呢也是一样,不过没有关系,接下来就来为大家分享关于postgresql 创建用户和postgresql如何用新创建的用户登录呢的

2026年1月28日 16:30

工程师一个月能赚多少钱(造价工程师一般月收入是多少 需求量大吗)

工程师一个月能赚多少钱(造价工程师一般月收入是多少 需求量大吗)

大家好,工程师一个月能赚多少钱相信很多的网友都不是很明白,包括造价工程师一般月收入是多少 需求量大吗也是一样,不过没有关系,接下来就来为大家分享关于工程师一个月能赚多少钱和造价工程师一般月收入是多少 需求量大吗的一些知识点,大家可以关注收藏

2026年7月4日 11:00

开端15集免费观看全集完整版(开端电视剧免费观看大结局)

开端15集免费观看全集完整版(开端电视剧免费观看大结局)

大家好,如果您还对开端15集免费观看全集完整版不太了解,没有关系,今天就由本站为大家分享开端15集免费观看全集完整版的知识,包括开端电视剧免费观看大结局的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录开端电视剧免费

2025年6月30日 15:15

deduce有名词形式吗(He has to deduce what he can from the few scanty clues available)

deduce有名词形式吗(He has to deduce what he can from the few scanty clues available)

本篇文章给大家谈谈deduce有名词形式吗,以及He has to deduce what he can from the few scanty clues available对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的

2026年8月4日 14:30

delphi led扩展屏显示开发(用DELPHI模拟LED屏下的那种文字特效怎么做)

delphi led扩展屏显示开发(用DELPHI模拟LED屏下的那种文字特效怎么做)

各位老铁们好,相信很多人对delphi led扩展屏显示开发都不是特别的了解,因此呢,今天就来为大家分享下关于delphi led扩展屏显示开发以及用DELPHI模拟LED屏下的那种文字特效怎么做的问题知识,还望可以帮助大家,解决大家的一些

2025年12月17日 14:30

table manners可数吗(餐桌礼仪我知道的不多.Idon’t know______about_____ ______(翻译句子))

table manners可数吗(餐桌礼仪我知道的不多.Idon’t know______about_____ ______(翻译句子))

其实table manners可数吗的问题并不复杂,但是又很多的朋友都不太了解餐桌礼仪我知道的不多.Idon’t know______about_____ ______(翻译句子),因此呢,今天小编就来为大家分享table manners可

2025年6月29日 15:15

boards翻译(主板英文怎么说)

boards翻译(主板英文怎么说)

大家好,boards翻译相信很多的网友都不是很明白,包括主板英文怎么说也是一样,不过没有关系,接下来就来为大家分享关于boards翻译和主板英文怎么说的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!本文目录主板英文怎么说

2025年7月28日 15:30

z型檩条重量计算公式(钢结构算量中檩条怎么算)

z型檩条重量计算公式(钢结构算量中檩条怎么算)

大家好,z型檩条重量计算公式相信很多的网友都不是很明白,包括钢结构算量中檩条怎么算也是一样,不过没有关系,接下来就来为大家分享关于z型檩条重量计算公式和钢结构算量中檩条怎么算的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧

2025年8月6日 12:00

download是什么意思可以删除吗(Download什么意思,Download的文件夹能删了吗,)

download是什么意思可以删除吗(Download什么意思,Download的文件夹能删了吗,)

本篇文章给大家谈谈download是什么意思可以删除吗,以及Download什么意思,Download的文件夹能删了吗,对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,

2026年7月27日 03:15

trousers后面单复数(The+trousers用不用三单)

trousers后面单复数(The+trousers用不用三单)

本篇文章给大家谈谈trousers后面单复数,以及The+trousers用不用三单对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录The+

2026年5月7日 03:00

linux是自由软件吗(Linux是自由软件,什么是自由软件,它包含哪些含义)

linux是自由软件吗(Linux是自由软件,什么是自由软件,它包含哪些含义)

大家好,今天小编来为大家解答以下的问题,关于linux是自由软件吗,Linux是自由软件,什么是自由软件,它包含哪些含义这个很多人还不知道,现在让我们一起来看看吧!本文目录Linux是自由软件,什么是自由软件,它包含哪些含义Linux与GN

2026年4月14日 08:15

手机怎样建个人网站(怎么建设手机网站)

手机怎样建个人网站(怎么建设手机网站)

大家好,关于手机怎样建个人网站很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于怎么建设手机网站的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录怎么建设手

2026年5月23日 11:45

springmvc答辩问题(我的毕业设计是JSP+mysql+Tomcat搭建的一个管理系统,答辩老师问我是怎么设计的,我应该)

springmvc答辩问题(我的毕业设计是JSP+mysql+Tomcat搭建的一个管理系统,答辩老师问我是怎么设计的,我应该)

大家好,如果您还对springmvc答辩问题不太了解,没有关系,今天就由本站为大家分享springmvc答辩问题的知识,包括我的毕业设计是JSP+mysql+Tomcat搭建的一个管理系统,答辩老师问我是怎么设计的,我应该的问题都会给大家分

2025年11月16日 05:00

escribe(这几个词该怎么翻译成中文circumscribed spher、ensphere、insphere、intersphere、midsphere、)

escribe(这几个词该怎么翻译成中文circumscribed spher、ensphere、insphere、intersphere、midsphere、)

大家好,今天小编来为大家解答以下的问题,关于escribe,这几个词该怎么翻译成中文circumscribed spher、ensphere、insphere、intersphere、midsphere、这个很多人还不知道,现在让我们一起来

2026年3月10日 02:00

近期文章

本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索