精华内容
下载资源
问答
  • 2021-05-19 08:09:17

    我们都知道在数据类型中,char类型占1个字节,short占2个字节,int占4个字节,long占8个字节等等。

    在计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取决于结构体中最大基本类型的大小,下面我们看几个例子:

    1.

    struct A

    {

    char a;

    int b;

    short c;

    }str1;

    这里char占1个字节,int占4个字节,short占2个字节,按单元存放如下图:

    1  2  3  4

    a

    b

    b

    b

    b

    c

    c

    由于a占用了1个字节,b存不下,所以开辟新的单元存放b,然后再开辟新的单元存放c。

    从这里可以看出结构体在内存中是按单元存放的,总占用字节数就是3*4=12。

    2.

    struct B

    {

    char a;

    short c;

    int b;

    }str2;

    存放如图:

    1  2  3  4

    a

    c

    c

    b

    b

    b

    b

    在这里由于b占用4个字节,而a和c总共才占用3个字节,足够c存放,所以c存放在a的后面,再开辟新的单元存放b。

    此例中占用字节数为2*4=8。

    3.

    struct c

    {

    char a;

    char b[2];

    char c[4];

    }str3;

    存放如图:

    1  2  3  4  5  6  7

    a

    b

    b

    c

    c

    c

    c

    这里由于数据类型都为char类型,故不必再开辟新的单元,一行存完。

    占用字节数为1*1+2*1+4*1=7。

    综上所述,结构体在内存中存放是按单元存放的,所开辟单元的最大长度取决于占字节最大的数据类型,此外我们可以发现存储顺序对空间的使用率有一定的影响。

    从以上三例可以看出,第一种最浪费空间;第三种最节省空间,但全使用相同类型,丢失了字段本生的数据类型,不方便使用;第二种介于第一种和第三种写法之间,其空间上比较紧凑,同时又保持了结构体中字段的数据类型。大家可以尝试用sizeof()去深入了解结构体中的按单元存放。

    C语言结构体的字节对齐原则

    为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据 ...

    C语言常见类型占用字节数

    前言 最近笔试经常遇到c语言各类型变量所占字节数的问题,这里做一个总结好了. 类型 常见的有char.int.long.short.float.double及指针等. 字符类型 这里单只char,ch ...

    C语言结构体变量字节对齐问题总结

    结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但 ...

    C语言结构体在内存中的存储情况探究------内存对齐

    条件(先看一下各个基本类型都占几个字节): void size_(){ printf("char类型:%d\n", sizeof(char)); printf("int类 ...

    C语言结构体的字节对齐

    Test Code: #include #include using namespace std; struct A{ int a; ...

    漫谈C语言结构体struct、公用体union空间占用

    先用代码说话: #include union union_data0{ int a ;//本身占用4个字节 char b ;//本身占用1个字节 int c ; }; u ...

    [置顶]
 什么是C语言结构体字节对齐,为什么要对齐?

    一.概念 对齐跟数据在内存中的位置有关.如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐.比如在32位cpu下,假设一个整型变量的地址为0x00000004,那它就是自然对齐的.   ...

    失落的C语言结构体封装艺术

    Eric S. Raymond 目录 1. 谁该阅读这篇文章 2. 我为什么写这篇文章 3.对齐要求 4.填充 5.结构体对齐及填充 6.结构体重排序 ...

    (转)失落的C语言结构体封装艺术

    目录1. 谁该阅读这篇文章 2. 我为什么写这篇文章 3.对齐要求 4.填充 5.结构体对齐及填充 6.结构体重排序 7.难以处理的标量的情况 8.可读性和缓存局部性 9.其他封装的技术 10.工具 ...

    随机推荐

    MSDN Library for vs 2010安装及使用(MSDN Library)

    VS2010正式版不再有单独的MSDN Library安装选项,VS2010的ISO安装光盘里已经包含有MSDN Library,只不过要手动安装,方法如下: 1.安装完VS2010后,在开始菜单中打 ...

    JavaScript parseInt() toString()函数

    parseInt(string, radix) string:必需.要被解析的字符串 radix:可选.表示要解析的数字的基数.该值介于 2 ~ 36 之间. 如果省略该参数或其值为 0,则数字将以 ...

    C#操作XML小结(转)

    一.简单介绍 using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument(); //导入指定xml文件 xml.Load(path); ...

    DOS 全集

    DOS全集 winver 检查Windows版本 wmimgmt.msc 打开Windows管理体系结构(wmi) wupdmgr Windows更新程序 wscript Windows脚本宿主 ...

    Hibernate @Embeddable注解

    在hibernate中实现自己定义类型,仅仅要实现UserType接口就可以或者以Component的形式提供.JPA的@Embedded有点类似,通过此凝视能够在你的Entity中使用一般的java ...

    mysql进阶(二十)CPU超负荷异常情况

    CPU超负荷异常情况 问题 项目部署阶段,提交订单时总是出现cpu超负荷工作情况,导致机器卡死,订单提交失败.通过任务管理器可见下图所示: 通过任务管理器中进程信息(见下图)进行查看,可见正是由于项目 ...

    爬虫之Splash

    Splash 是一个JavaScript渲染服务,是一个带有HTTP API 的轻量级浏览器,同时它对接了Python中Twisted和QT库. 1.功能介绍 1)异步方法处理多个网页渲染过程: 2) ...

    第25月第2天 Django-By-Example项目记录01

    1. export PATH="$PATH":/Applications/XAMPP/xamppfiles/bin/ sudo ln -s /Applications/XAMPP/ ...

    更多相关内容
  • 1.下列程序中,结构体变量n所占内存字节数是(答案为6?) union U {  char s[4];   int i;  long l; }; struct A {  int c;  union U u; }a; 2.若有下面的说明和定于: struct test {  int m1;...

    有朋友问:

    1.下列程序中,结构体变量n所占内存字节数是(答案为6?)

    union U
    {
            char s[4];        
            int i;
            long l;
    };
    struct A
    {
            int c;
            union U u;
    }a;

    2.若有下面的说明和定于:
    struct test
    {
            int m1;char m2;float m3;
            union uu{ char u1[5];int u2[2];} ua;

    }myaa;
    则sizeof(struct test)的值是(答案为12?)

    3.在16位的PC机上使用c语言,若有如下定义:
    struct data
    {
            int i;
            char ch;
            double f;
    }b;
    则结构变量b占用内存的字节数是(答案为11?)

    答复:
    如果你这是考试用题,建议你采用这个方式来计算:
    1、假设是在16位IBM-PC机上计算所占用内存的字节数,决定了各类型的宽度;
    2、union(共用体)变量的所占用内存的字节数为变量类型定义的变量的最大宽度变量;
    3、如果有数组要考虑数组的宽度(比如char[3]肯定小于int[2],cha[5]就按5个字节算,因为大于了int[2]);
    4、结构体变量所占用内存的字节数是其所有成员所占用内存字节数之和;
    5、结构体里有结构体也要按照上面的方法计算。

    那么,由于假设16位IBM-PC机,所以:
    char:1字节、short:2字节、int:2字节、long:4字节、long long(即long long int):4字节、float:4字节、double:8字节、long doubule:10字节
    这样你就好计算了:
    题目1:union U u; u的宽度为最大char s[4];的4个字节,int c;2个字节。所以结果为6个字节。
    题目2、题目3你自己应该就会算了吧?

    有个问题还是要补充一下,在现在我们用的IDE在实际环境中,由于为了实现更快寻址和达到性能更优的原因,会有本机宽度和字节对齐的情况发生,所以你在你具体应用中会有一些不同情况的出现。另外,long double占用10字节空间,但有的编译器并不认可10字节,还是8字节,比如在VC++6.0下,用sizeof(long double)测出来的值仍然是8。所以我强调了第1点假设是在16位IBM-PC机上,而且估计你提的这几个问题都是考试用的,所以就按我上面说的方法去计算就可以。

     

    展开全文
  • 判断结构体变量所占字节数

    千次阅读 2018-07-29 21:19:14
    1,结构体总长度一定是最长字节数的整数倍,double除外,若出现double还是除它之外的最大类型的字节数的整数倍,double还是按8字节算 2,每个成员偏移量一定是改成员长度的整数倍 eg #include <stdio.h&...

    规则

    1,结构体总长度一定是最长字节数的整数倍,double除外,若出现double还是除它之外的最大类型的字节数的整数倍,double还是按8字节算

    2,每个成员偏移量一定是改成员长度的整数倍

    eg

    
    #include <stdio.h>
    
    struct student
    {
        char name[20];
        int a;
        short b;
    };
    
    int main()
    {
        printf("%d\n", sizeof(struct student));
        return 0;
    }

     

    嵌套结构体所占字节数示例

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    struct AA
    {
        int a;
        char b;
    };
    struct student
    {
        short c;
        struct AA aa;
    
        char sex;
        
    };
    
    int main()
    {
        printf("%d\n", sizeof(struct student));
     
        return 0;
    }
    

    说明:

    1,struct AA aa,占8个字节; 然后将其整体带入struct student{....}结构体中, short 补两个字节 4+8+1=13, 需要再补三个字节使其为4的倍数

    展开全文
  • 看到个写得比较好的博文,转给大家看看 格式一:  1 2 3 4 5 6 01.structtagPhone ... 04.intB; 05.shortC; 06.}Phone;  格式二: ...

    看到个写得比较好的博文,转给大家看看

     

    格式一:  

    1

    2

    3

    4

    5

    6

    01.struct tagPhone

    02.{

    03.     char   A;

    04.     int    B;

    05.     short  C;

    06.}Phone;

      格式二:

    1

    2

    3

    4

    5

    6

    01.struct tagPhone

    02.{

    03.     char   A;

    04.     short  C;

    05.     int    B;

    06.}Phone2;

      格式三:

    1

    2

    3

    4

    5

    6

    01.struct tagPhone3

    02.{

    03.     char   A;

    04.     char   B[2];

    05.     char   C[4];

    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 求大小与预期一样的写法,但是全部使用字节类型,丢失了字段本生的数据类型,不方便使用;

    第二种写法,介于第一种和第三种写法之间,其空间上比较紧凑,7a686964616fe58685e5aeb931333337616465同时又保持了结构体中字段的数据类型。

     

      只要了解是这些写法的差异性,可以视情况选用。

     

    展开全文
  • 结构体所占内存字节数如何计算?

    万次阅读 多人点赞 2019-08-22 21:43:23
    我们知道,为了提高内存寻址的效率,很多处理器体系结构为特定的数据类型引入 了特殊的内存对齐需求。不同的系统和编译器,内存对齐的方式有所不同,为了满足 处理器的对齐要求,可能会在较小的成员后加入补位,...
  • struct结构体占内存字节数

    千次阅读 2020-03-20 10:01:18
    昨天写了一个结构体demo,心血来潮打印struct所占内存字节数 struct student{ char name[20]; char sex; int num; float score[3]; void print(); }; 你猜猜是多少个字节呢(对于char[]这样的赋值,先暂且...
  • 字节数: 环境 char short int long long long float double 指针 windows(64) 1 2 4 4 4 8 8 4 (无符号型在原来的基础上不变,例如 undigned int依旧为4个字节) 计算字节数*(在window环境下对齐参数与原...
  • C语言-结构体struct所占字节数计算

    千次阅读 2021-11-24 10:20:08
    从C语言设计准测角度理解结构体所占字节数
  • struct 结构体 所占字节数的计算

    千次阅读 多人点赞 2019-10-10 19:29:39
    定义结构体类型,只能说明该类型的组成情况,并没有分配内存空间。只有当定义属于结构体类型的变量时,系统才会分配空间给该变量
  • union、struct、class占用字节数

    千次阅读 2020-02-10 23:40:25
    union变量占用内存长度等于最长的成员的内存长度。 struct和class内存中存储形式一样(函数不占内存空间)。 union 当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。在C Prog.....
  • 字符串所占字节数分析

    千次阅读 2021-05-19 10:02:55
    char *s="\ta\017bc"中指针变量s 指向的字符串所占字节数是6的原因。'\t' 是一个转义字符相当于键盘“Tab”键‘a’ 普通字符'\017'转义字符ASCII代码值为8进制数17即10进制数15的那个符号(LZ可以自己去查下看是什么...
  • 首先,我们来看一下下面这段代码。 #include <stdio.h>... int b; double c; }part1; struct B{ char a; double b; int c; }part_one; printf("%d %d", sizeof(part1), si...
  • 格式1 01.struct tagPhone 02.{ 03. char A; 04. int B; 05. short C; 06.}Phone; 格式2 01.struct tagPhone 02.{ 03. char A; 04. short C; 05. int B; 06.}Phone2; 格式3 0...
  • php怎么查看一个变量占用内存

    千次阅读 2019-03-26 11:19:01
    事例: ... echo ...memory_get_usage ...返回当前分配给你的 PHP 脚本的内存量,单位是字节(byte)。...大概了解10000个元素的整数组需要占用 388k 内存 ,从这个结果来看似乎一个数组元素大约占用了39个字节左右。
  • 原文链接:... 一个结构体变量占多大内存空间的问题   直接来看相同数据结构体的几种书写的格式吧。 格式一: 1. struct tagPhone  2. {  3. char A;  4. int B;  5. ...
  • python变量内存

    2022-03-16 09:40:39
    一般python的内存结构以64字节为一个单位,随便在python中申明变量abcdef,并赋上值,对应的内存结构大致是这样: 需要注意的是,分配出来的内存可能是连续的,下一个内存比上一个内存多64个字节,也可能是不连续...
  • C++ 结构体所占字节数

    千次阅读 2017-09-06 12:13:27
    在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上...
  • C/C++基本数据类型占用字节数

    千次阅读 2018-02-26 23:42:36
    基本数据类型占用字节数 32位编译器: char :1个字节 char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节) short int : 2个字节 int: 4个字节 unsigned int : 4个字节 ...
  • sizeof是C/C++中的一个operator,其作用就是返回一个对象或者类型所占的内存字节数(byte)。返回值是size_t,在头文件stddef.h中定义。 2、用法 sizeof的用法有一下3种: (1)sizeof(object);//即sizeof(对象) (2...
  • C语言 - 结构体所占字节数

    万次阅读 2018-07-04 11:57:35
    在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际...
  • 如何深入理解Lua数据结构内存占用? ** 导语 Lua底层数据结构内存动态分配,一般情况下不太好估算内存占用。腾讯游戏学院专家Ross在本文剖析lua常见数据结构string和table的底层实现原理,并从中找到一般性的...
  • c语言结构体struct所占字节数求解

    万次阅读 多人点赞 2018-10-27 15:24:25
    原本觉的c语言学的还不错,今天看了一下c语言的有关书籍,看到求结构体大小的例子,心想这不是很简单吗,不就是把所有成员的大小...这个结构体的大小是多少了,我做的是char占1字节,int占4字节,short占2字节,1 +...
  • 这几天有人问结构体占用内存的情况,
  • 文章目录32位编译器:32位系统下指针占用4字节64位编译器:64位系统下指针占用8字节内存对齐原理1.什么是内存对齐2.结构体内存对齐规则(请记住三条内存规则(在没有#pragam pack宏的情况下) 32位编译器:32位系统下...
  • C语言-struct 结构体变量内存分配

    千次阅读 多人点赞 2019-09-24 22:55:00
    struct内存分配 定义技巧 首先我们定义struct变量,笔者习惯定义时,直接输入: struct name { }; 再对struct内部成员进行定义,防止“;”遗漏,导致程序报错。 先看一段代码 #include<stdio.h> ...
  • 计算结构体的字节数

    千次阅读 2017-02-21 21:20:26
    结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。看下面这样的...
  • 结构体在内存占用的空间

    千次阅读 多人点赞 2018-06-03 16:54:32
    之前对结构占用内存一直很迷,下面就举个例子,到底是按照哪个变量类型计算内存?应该怎样计算才是正确的呢? struct str { char a; int b; float b; double d; }; 这个结构体占用的内存是多少呢? 运行...
  • 请问下面定义的结构体变量aa在计算机内存占用多少字节? #include main() { struct student { float height; short int age ; char sex ; }aa; printf("%d\n",sizeof(aa)); //屏幕上将显示多少? } 错误解答:...
  • C语言中结构体占用内存大小

    千次阅读 2018-09-20 16:06:44
    cpu每次传输数据大小由它的总线条决定,32位传输4个字节,64位传输8个字节。 这里以64位系统举例,若声明一个变量大小为8字节,起始地址位1,而cpu读取的地址为0~7, 变量需要读取两次,显然降低了cpu的性能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 111,697
精华内容 44,678
关键字:

则结构变量b占用内存的字节数是