0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

结构体大小的获取

CHANBAEK 来源:小木编程 作者:小木之 2023-03-14 17:30 次阅读

结构体大小的获取

  • 我们使用sizeof()函数来获取结构体的大小
#include


struct test1
{
  int a; // 0 1 2 3
  char b; // 4
  float c; // 8 9 10 11
};


struct test2
{
  int a; // 0 1 2 3
  char b; // 4
  char d; // 5
  char e; // 6
  float c; // 8 9 10 11
};

int main()
{
  struct test1 t1;
  struct test2 t2;  
  int s1=sizeof(t1);
  int s2=sizeof(t2);
  printf("s1=%d,s2=%d",s1,s2);


  return 0;
}

输出结果:

s1=12,s2=12
  • 从上面的例子我们可以看到,t1,t2
    两个结构体的内部的成员变量构成明明不一样,但是最终结构体的大小却是相同的,都是12字节。
  • 这就是因为结构体内存对齐的原因,使得构成并不相同的两个结构体在大小上却是相同的。
  • 其中t2中成员变量d,e占据的内存,是在结构体内存对齐后补齐的空位,因此结构体整体的大小并没有增加。
  • 正是因为结构体存在内存对齐,所以无法对结构体进行比较高效的直接比较,也就是无法对两个结构体整体进行比较。
  • 那么为了比较结构体,我们就想到了对结构体内部成员变量的比较。

结构体的比较

既然要对结构体的成员变量进行比较,那么我们就要先能够获取成员变量。

// 获取方法
变量名.成员变量名
// 对于t1,我们如果想要获取t1的内部成员变量a,那么我们就可以这样写:
t1.a
#include


struct test1
{
  int a;
  char b;
  float c; 
};


// 那么当我们判断两个test1类型的结构体t1,t2是否相等时,就可以这么写
int isEqual(test1 x,test1 y)
{
  if(x.a==y.a && x.b==y.b && x.c==y.c)
  {
    return 1;  // 相等返回 1
  }
  else return 0;  // 不相等返回 0
 } 

int main()
{
  struct test1 t1={1,'a',2.1};   // 声明两个test1类型的结构体变量
  struct test1 t2={1,'a',2.1};
  int r=isEqual(t1,t2);  // 调用函数进行比较
  printf("%d",r);
  return 0;
}

输出结果:

1
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    8

    文章

    3008

    浏览量

    73919
  • 函数
    +关注

    关注

    3

    文章

    4317

    浏览量

    62487
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28342
  • sizeof
    +关注

    关注

    0

    文章

    9

    浏览量

    6436
  • 结构体
    +关注

    关注

    1

    文章

    130

    浏览量

    10839
收藏 人收藏

    评论

    相关推荐

    【武汉华嵌】结构的sizeof问题

    和编译器有关。就一般情况而言,主要有以下三个原则:1) 结构变量的首地址能够被其最宽基本类型成员的大小所整除;2) 结构每个成员相对于
    发表于 03-22 16:26

    labview调用dll获取硬件信息结构求教

    想调用winmm.dll中的waveOutGetDevCaps获取声卡信息,但是里面有结构数据,尝试了几次都失败告终,求大虾指教。MMRESULT waveOutGetDevCaps
    发表于 01-14 10:20

    关于操作系统的结构指针使用方式

    结构的变量的指针和结构体内部成员的指针的关系其实他们两者在内存地址上是有一定的数值关系的。其实结构变量的地址和
    发表于 10-06 23:44

    漫谈C语言结构

    不是8 byte。  所以,结构成员变量的放置顺序影响着结构所占的内存空间的大小。一个结构
    发表于 11-15 15:59

    使用结构的主要作用

    结构作用(STM32)来源:正点原子MDK 中很多地方使用结构以及结构指针,下面总结一下其
    发表于 08-24 07:54

    关于labview传入参数到DLL结构

    labview给DLL中结构传入参数,要保证字节对齐下面是注意事项,很关键:labview中层次结构数据类型(例如,簇)中的数组和字符串始终包括大小信息。所以簇内存中包含字符串的
    发表于 11-08 20:30

    结构变量的定义与使用变量访问结构成员

    知识点回顾关于找最大公共子串的两种解题方法结构的定义(3种)结构变量的定义与使用变量访问结构
    发表于 12-17 07:10

    消息队列传递结构指针和结构异同

    FreeRTOS消息队列 传递结构指针和结构异同1 消息队列传递结构指针和
    发表于 02-11 07:02

    C语言中创建一个结构其实际占用的内存空间大小是多少呢?

    际占用的内存空间大小是多少呢?示例代码如下:struct S{int i;char c;int j;};要正确计算结构大小,首先需要了解数据对齐的原理。数据对齐
    发表于 09-29 11:57

    如何设计只有数据字段的结构

    的实例时,结构的数据成员会按其声明的顺序连续存储。然而,这个声明的顺序也是有学问的,顺序不同结构大小可能有很大差别,数据成员的访问性能
    的头像 发表于 08-23 09:37 1546次阅读
    如何设计只有数据字段的<b class='flag-5'>结构</b><b class='flag-5'>体</b>

    一个经典的结构和联合体共用实例

    结构占用的内存大小,首先和编译器的系统位数有关系,类似于CPU是 64 bits 还是 32 bits 的情形;其次,结构需要考虑字节对
    的头像 发表于 05-04 11:49 664次阅读
    一个经典的<b class='flag-5'>结构</b><b class='flag-5'>体</b>和联合体共用实例

    C语言计算结构占用的空间大小

    计算以下两个结构所占空间大小分别是多少?
    发表于 08-24 16:03 447次阅读

    经典 C 语言编程,结构和联合体如何共用?

    中可以 使用 sizeof 进行获取,默认为字节对齐的大小。 联合体 联合体的参数共享同一个内存地址,所占的内存大小完全是由联合体中参数类型决定字长,然后数据共享,内存共享等。 结构
    的头像 发表于 01-11 18:24 1278次阅读
    经典 C 语言编程,<b class='flag-5'>结构</b><b class='flag-5'>体</b>和联合体如何共用?

    你是否真的了解结构占用了多少字节?

    结构成员所占内存空间大小一般情况下,如果想知道结构成员的内存占用情况需要:1、先用结构
    的头像 发表于 06-04 08:04 393次阅读
    你是否真的了解<b class='flag-5'>结构</b><b class='flag-5'>体</b>占用了多少字节?

    结构成员的顺序会影响结构大小

    相同的结构成员,如果把顺序调整一下,会不会影响结构大小? 答案是会的,这主要跟字节对齐有关。 比如这样的
    的头像 发表于 11-25 16:24 110次阅读