CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

怎样得到结构体的实际大小值??

楼主seu07201213(【_】〖汪洋中的一片叶子〗≈^︵^≈)2005-08-04 10:44:18 在 C/C++ / C语言 提问

typedef   struct   _msg  
  {        
        char   cmd[10];          
        char   addition[10];      
        char   content[1024];    
  }Message;  
   
  Message   msg;  
  strcpy(msg.cmd   ,   "11");  
  strcpy(msg.addition,   "12");  
  strcpy(msg.content,   "13");  
   
  用sizeof(Message)或者sizeof(msg)得到的只是定义结构体时的大小:1044;  
  怎样才能得到msg的实际大小:6   呢?  
  问题点数:20、回复次数:23Top

1 楼junguo(junguo)回复于 2005-08-04 10:49:52 得分 1

你的msg就是1044啊!content不管它里面的字符串是多长,它的大小都是已经分配了的!  
   
  如果你想得到字符串的长度,可以用strlen来计算!Top

2 楼oo(为了名副其实,努力学习oo技术ing)回复于 2005-08-04 10:50:44 得分 1

本来就是1044,  
  你的6是怎么得来的?Top

3 楼dirdirdir3(风)回复于 2005-08-04 10:53:07 得分 1

msg的实际大小也是1044啊,只不过有些空间为0而已。  
  要得到6只能你自己进行计算了。Top

4 楼seu07201213(【_】〖汪洋中的一片叶子〗≈^︵^≈)回复于 2005-08-04 10:56:33 得分 0

6     指的是里面字符串的总长度.   难道先要转换成char   ,再用strlen   ??Top

5 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-08-04 10:57:50 得分 1

strlen(msg.cmd)+strlen(msg.addition)+strlen(msg.content)Top

6 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-08-04 10:58:33 得分 0

最后再加上3.Top

7 楼XBox360(菜)(鸟)回复于 2005-08-04 11:15:06 得分 1

sizeof肯定是1044了Top

8 楼jixingzhong(瞌睡虫·星辰)回复于 2005-08-04 11:36:33 得分 1

strlen(msg.cmd)+strlen(msg.addition)+strlen(msg.content)  
   
   
   
  这个就是你要的   6  
   
  由于是数组形式         后面没有   '\0‘  
   
  这个就是你要的结果了         不需要   +3   了Top

9 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-08-04 11:45:35 得分 1

后面有'\0'的,你自己试一下就知道了。  
   
  先把msg.cmd全部用1填充,然后strcpy(msg.cmd   ,   "11");你就知道了,msg.cmd[2]='\0'。Top

10 楼bingbox_1984(苦丁茶)(我只喜欢CC)回复于 2005-08-04 12:31:36 得分 1

strlen(msg.cmd)+strlen(msg.addition)+strlen(msg.content)  
   
  strlen(msg.cmd)==2  
  ........  
  .......  
   
  Top

11 楼kobefly(科比--网络学习中)回复于 2005-08-04 13:08:46 得分 0

??Top

12 楼afx_swallow(足球和啤酒)回复于 2005-08-04 13:11:29 得分 1

怎么会是6呢?Top

13 楼MiloChin(游荡者)回复于 2005-08-04 13:26:36 得分 1

I   think   the   poster   means   the   actual   size   of   variable   msg   in   memory.   Variable   msg   is   allocted   1044   bytes   once   the   code   is   executed,   so   whatever   string   you   assign   to   msg.content,   the   actual   size   of   variable   msg   is   always   1044   bytes   in   memory,   even   only   a   character   "a"   in   msg.content.Top

14 楼MiloChin(游荡者)回复于 2005-08-04 13:31:52 得分 1

Addon:   There's   a   difference   between   sizeof()   and   strlen().   Sizeof()   calculates   the   size   of   a   variable   in   memory,   while   strlen()   just   calculates   how   many   characters   a   character   array(a   string)   has.  
  I   guess   the   poster   is   just   confused   with   these   2   functions.Top

15 楼lxk_cool()回复于 2005-08-04 15:13:15 得分 1

不懂,请教一下  
  #include<iostream>  
  using   namespace   std;  
  struct   ss{  
  int   i;  
  int   c[10];  
  char   d[5];  
  };  
   
  int   main()  
  {  
  ss   a;  
  cout<<sizeof(a)<<endl;//??????     52  
  cout<<sizeof(a.c)<<"   "<<sizeof(a.i)<<"   "<<sizeof(a.d)<<endl;  
                                      //40   4   5   不是49么  
  return   0;  
  }Top

16 楼MiloChin(游荡者)回复于 2005-08-05 11:50:18 得分 1

这个问题和内存边界对齐有关,按照32位字长的机器而言,通常会给结构变量分配4个字节的倍数大的内存。  
  a.i变量和a.c数组内存的分配大小是4的倍数,但是a.d字符数组的话只占用5个字节,在内存里的储存结构是这样安排的:  
  1111   1000  
  前面5个1代表字符数组的内存分配地址,后面的3个字节0也系统额外分配给结构a变量的内存地址,为了符合边界对齐(内存寻址机制),但结构变量a将放弃对这3个字节的利用,这也就是说要白白浪费这3个字节,这就是为什么sizeof(a)返回52个字节,要比49多3个字节的原因,因为49不是4的倍数。  
  这种边界对齐机制有时会造成内存浪费,特别是在有上千个结构数组的时候,。Top

17 楼antijpn(antijpn)回复于 2005-08-05 15:09:16 得分 1

根本没有可能得到结构体的真实大小,只能得到存储映像的大小。  
   
  对于bit   field,不看struct的定义是无法获知大小的Top

18 楼liuhaimiao()回复于 2005-08-05 15:09:16 得分 1

虽然sizeof的返回大小是1044,但实际占用的空间大小有可能大于1044  
  这是因为内存对齐的原因Top

19 楼ruiding(瑞丁)回复于 2005-08-05 15:53:27 得分 1

请问   这条语句#pragma   pack   (1)  
   
  是表示编译器不考虑字节对齐方式,还是表示编译器按一个字节对齐.  
   
  两者能等同吗?Top

20 楼InToTheSea(编程浪子)回复于 2005-08-06 10:33:14 得分 1

#pragma   pack   (1)  
  语句表示强制让编译器按一个字节对齐Top

21 楼ruiding(瑞丁)回复于 2005-08-07 15:13:16 得分 1

 
   
  强制让编译器按一个字节对齐  
  和编译器不考虑字节对齐方式能等同吗....Top

22 楼tufaqing()回复于 2005-08-08 13:20:49 得分 1

vc不是紧凑方式对齐的,他是以结构里的最大存储类型的整数倍来分配的。  
      struct   ss{  
  int   i;  
  int   c[10];  
  char   d[5];  
      };  
  ss有两个类型int和char,按sizeof(int)   =   4为单位分配,4   <   sizeof(ss.d)   <   8,故给他分配8  
  char   d[5],   d[6],   d[7],   d[8]都分配8,   char   d[9]就分配12了。  
   
  struct   tt   {  
                double   a;  
                int   b;  
                int   c;  
                char   d;  
  };  
  sizeof(tt)   =   8   +   8   +   0   +   8   =   24;   (   b,c   刚好占一个double长)  
  Top

23 楼tufaqing()回复于 2005-08-08 13:28:06 得分 1

struct   tt1   {  
                double   a1;  
                double   a2;  
                double   a3;  
                int   b;  
                int   c;  
                char   d;  
  };  
   
  struct   tt2   {  
                double   a1;  
                int   b;  
                double   a2;  
                int   c;  
                double   a3;  
                char   d;  
  };  
  sizeof(tt1)   =   8   +   8   +   8   +   8   +   0   +   8   =   40;  
  sizeof(tt2)   =   8   +   8   +   8   +   8   +   8   +   8   =   48;  
   
  Top

相关问题

  • 请大家谈谈数据结构在实际编程中的实用价值
  • 结构体大小问题?
  • 结构大小的问题
  • 结构赋值!??
  • ram值大小
  • 打印大小和实际大小不一样的问题。
  • 设计时窗体大小与实际大小不一致!?
  • 关于结构体的大小
  • 看看这个结构体的大小
  • 结构的字节大小问题

关键词

  • msg
  • strlen
  • 字符串
  • 大小
  • 实际
  • cmd
  • addition
  • 得到
  • strcpy
  • variable

得分解答快速导航

  • 帖主:seu07201213
  • junguo
  • oo
  • dirdirdir3
  • megaboy
  • XBox360
  • jixingzhong
  • megaboy
  • bingbox_1984
  • afx_swallow
  • MiloChin
  • MiloChin
  • lxk_cool
  • MiloChin
  • antijpn
  • liuhaimiao
  • ruiding
  • InToTheSea
  • ruiding
  • tufaqing
  • tufaqing

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo