服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言详细分析讲解struct与union使用方法

C语言详细分析讲解struct与union使用方法

2022-11-12 16:50清风自在 流水潺潺 C/C++

最近开始自学C语言,从最基础部分的开始学起。今天看书的时候注意到了struct和union似乎很像,除了名字不同,看起来几乎没有区别。既然C中定义了struct和union两个关键字,那么它们肯定是有区别的,在查了一些资料之后我来总结

一、struct 的小秘密

C语言中的 struct 可以看作变量的集合

struct 的问题:空结构体占用多大内存?下面编写程序看一下吧:

#include <stdio.h>

struct TS
{

};

int main()
{
  struct TS t1;
  struct TS t2;
  
  printf("sizeof(struct TS) = %d\n", sizeof(struct TS));
  printf("sizeof(t1) = %d, &t1 = %p\n", sizeof(t1), &t1);
  printf("sizeof(t2) = %d, &t2 = %p\n", sizeof(t2), &t2);
  
  return 0;
}

下面为输出结果,可以看到在 gcc 编译器中空结构体的大小就为0。

C语言详细分析讲解struct与union使用方法

 

二、结构体与柔性数组

  • 柔性数组即数组大小待定的数组
  • C 语言中可以由结构体产生柔性数组
  • C 语言中结构体的最后一个元素可以是大小未知的数组

思考一下,下面的语句所占内存空间为多少呢,没错,就是 4。

C语言详细分析讲解struct与union使用方法

SoftArray 中的 array 仅是一个待使用的标识符,不占用存储空间。

下面看一段柔型数组使用的代码:

#include<stdio.h>
#include<malloc.h>

struct SoftArray
{
  int len;
  int array[];
};

struct SoftArray* create_soft_array(int size)
{
  struct SoftArray* ret = NULL;
  
  if(size > 0)
  {
      ret = (struct SoftArray*)malloc(sizeof(struct SoftArray) + sizeof(int) * size);
      
      ret->len = size;
  }
  return ret;
}

void delete_soft_array(struct SoftArray* sa)
{
  free(sa);
}

void func(struct SoftArray* sa)
{
  int i = 0;
  
  if(NULL != sa)
  {
      for(i = 0; i < sa->len; i++)
      {
          sa->array[i] = i + 1;
      }
  }
}

int main()
{
  int i = 0;
  struct SoftArray* sa = create_soft_array(10);
  
  func(sa);
  
  for(i = 0; i < sa->len; i++)
  {
      printf("%d\n",sa->array[i]);
  }
  
  delete_soft_array(sa);
  
  return 0;
}

下面为输出结果:

C语言详细分析讲解struct与union使用方法

虽然 array[ ] 数组在定义的时候没有指定大小,但是可以在后面使用 malloc 函数来指定大小。柔性数组的好处就是 func() 函数有一个指向柔性数组的合法指针就行,不用传递要处理的数组大小。

 

三、C语言中的 union

  • C语言中的 union 在语法上与 struct 相似
  • union 只分配最大成员的空间,所有成员共享这个空间

如下:

C语言详细分析讲解struct与union使用方法

union 的使用受系统大小端的影响

如下,就是定义的字面量常数 i 在大小端的存储位置:

C语言详细分析讲解struct与union使用方法

小端模式下地址值存储低位数据,大段模式下低地址存储高位数据。

下面编写程序来判断一下系统的大小端:

#include <stdio.h>

int system_mode()
{
  union SM
  {
      int i;
      char c;
  };

  union SM sm;
  
  sm.i = 1;
  
  return sm.c;
}


int main()
{
  printf("System Mode: %d\n", system_mode());
  return 0;
}

下面为输出结果:

C语言详细分析讲解struct与union使用方法

所以说我的电脑系统是小端

四、小结

  • struct 中的每个数据成员有独立的存储空间
  • struct 可以通过最后的数组标识符产生柔性数组
  • union 中的所有数据成员共享同一个存储空间
  • union 的使用会受到系统大小端的影响

到此这篇关于C语言详细分析讲解struct与union使用方法的文章就介绍到这了,更多相关C语言 struct与union内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_43129713/article/details/123248823

延伸 · 阅读

精彩推荐
  • C/C++C++ 智能指针代码解析

    C++ 智能指针代码解析

    这篇文章主要介绍了c++ 智能指针基础的相关资料,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下,希望能给你带来帮助...

    Christo34072022-01-24
  • C/C++C语言解决螺旋矩阵算法问题的代码示例

    C语言解决螺旋矩阵算法问题的代码示例

    这篇文章主要介绍了C语言解决螺旋矩阵算法问题的代码示例,螺旋矩阵中的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环...需要...

    hzy37745572021-03-31
  • C/C++Qt图形图像开发之曲线图表模块QChart库坐标轴和数据不对应、密集的散点图无法显示问题解决方法

    Qt图形图像开发之曲线图表模块QChart库坐标轴和数据不对应、密

    这篇文章主要介绍了Qt图形图像开发之曲线图表模块QChart库坐标轴和数据不对应、密集的散点图无法显示问题解决方法,需要的朋友可以参考下 ...

    qq_6106429272021-08-23
  • C/C++C++中的变长参数深入理解

    C++中的变长参数深入理解

    变长参数的函数,即参数个数可变、参数类型不定的函数。设计一个参数个数可变、参数类型不定的函数是可能的,最常见的例子是printf函数、scanf函数和...

    kevonyang4082021-04-18
  • C/C++详解C++编译器优化技术

    详解C++编译器优化技术

    现代编译器缺省会使用RVO(return value optimization,返回值优化)、NRVO(named return value optimization、命名返回值优化)和复制省略(Copy elision)技术,来减少拷...

    可可西4142021-11-12
  • C/C++从C语言过渡到C++之基本变化

    从C语言过渡到C++之基本变化

    在之前的C++代码训练营系列中,我试图用完成具体项目的方式给大家介绍C++,但后来大家反馈说这样从C过渡到C++有点跟不上。于是我又专门设计了这个《从...

    天花板6482021-05-26
  • C/C++DSP中浮点转定点运算--定点数的加减乘除运算

    DSP中浮点转定点运算--定点数的加减乘除运算

    本文主要介绍DSP中定点数的加减乘除运算,很值得学习一下,需要的朋友可以参考一下。...

    ganxingming12402021-04-07
  • C/C++针对Ruby的Selenium WebDriver安装指南

    针对Ruby的Selenium WebDriver安装指南

    这篇文章主要介绍了针对Ruby的Selenium WebDriver安装指南,Selenium直接运行于浏览器之中,是进行各种调试的一大神器,需要的朋友可以参考下...

    C语言教程网8352021-03-02