C语言_struct和union的分析;利用struct创建弹性数组(柔性数组)union判断系统大端小端

本文深入分析了C语言中的struct和union。探讨了空结构体的内存占用,特别介绍了如何利用struct创建柔性数组及其使用方法,通过实例展示了存储斐波那契数列的应用。同时,文章还对union进行了分析,指出union中所有域共享相同内存空间,并提到了大小端的概念,通过示例展示了大小端字节序的区别,以及在Windows系统中进行大小端判断的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

struct的分析

思考

空结构体占用多大内存?

struct D
{};

int main()
{
    struct D d1;
    struct D d2;
    printf("%d\n",sizeof(struct D));	//0
    printf("%d,%p\n",sizeof(d1),&d1);	//0,一个地址
    printf("%d,%p\n",sizeof(d2),&d2);	//0,地址跟d1一样
    
    return 0;
}

所以 空结构体不占有内存;


由结构体产生柔性数组

  • 柔性数组即数组大小待定的数组
  • C语言中结构体的最后一个元素可以是大小未知的数组
  • C语言中可以由结构体产生柔性数组
struct SofArray
{
    int len;
    int array[];
};

柔性数组使用分析

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

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

int main()
{
    int i = 0;    
    SoftArray* sa = (SoftArray*)malloc(sizeof(SoftArray) + sizeof(int)*10);
    sa->len = 10;
    for(i=0;i<sa->len;i++)
    {       //赋值
        sa->array[i] = i+1;
    }
    for(i=0;i<sa->len;i++)
    {       //输出验证
        printf("%d ",sa->array[i]);
    }
    free(sa);   //释放内存
    return 0;
}

输出 1 2 3 4 5 6 7 8 9 10

柔性数组的使用

存储斐波拉次数列

//定义柔性数组结构 	typedef struct
//创建柔性数组		creat_soft_array();
//生成斐波拉次数列	fac();
//释放柔性函数		delete_soft_array();
#include<stdio.h>
#include<malloc.h>

//定义柔性数组结构
typedef struct soft_array_
{
    int len;
    int array[];
}SoftArray;

SoftArray* create_soft_array(int size);
void fac(SoftArray* sa);
void delete_soft_array(SoftArray* sa);

int main()
{
    int i = 0;      //循环变量
    SoftArray* sa = create_soft_array(10);//偷懒了 长度直接写10
    fac(sa);        //生成斐波拉次数列

    for(i=0;i<sa->len;i++)
    {
        printf("%d\n",sa->array[i]);
    }
    
    delete_soft_array(sa);      //释放柔性函数
   
    return 0; 
}

//创建柔性数组
SoftArray* create_soft_array(int size)
{
    SoftArray* ret = NULL;
    if(size > 0)
    {   //分配内存
        ret = (SoftArray*)malloc(sizeof(*ret) + sizeof(*(ret->array))*size);
        ret->len = size;
    }
    return ret;
}

//生成斐波拉次数列
void fac(SoftArray* sa)
{
    int i;      //循环变量
    if(NULL != sa )
    {
        if(1 == sa->len)
        {       //只有一项时 第一项为1
            sa->array[0] = 1;
        }
        else
        {       //  从第三项开始算
            sa->array[0] = 1;
            sa->array[1] = 1;
            for(i=2;i<sa->len;i++)
            {
                sa->array[i] = sa->array[i-1] + sa->array[i-2];
            }
        }
    }
}

//释放柔性函数
void delete_soft_array(SoftArray* sa)
{
    free(sa);
}

第41行

ret = (SoftArray*)malloc(sizeof(*ret) + sizeof(*(ret->array))*size);

array[]分配内存时,用一个sizeof(*(ret->array)),这样写可以直接提出array的类型,修改数组类型时,只修改结构体就好

union的分析

struct对比一下

struct A
{
    int a;
    int b;
    int c;
};
union B
{
    int a;
    int b;
    int c;
};

int main()
{
    printf("%d\n",sizeof(struct A)); 	//12
    printf("%d\n",sizeof(union B));		//4
}

struct中的每个域在内存中都独立分配空间

union只分配最大域的空间,所有域共享这个空间


补充

大小端的概念之前没有了解过,回头写一下补充一下

请添加图片描述

int时4个字节,十六位数字时0x00000001

如图,在内存里 大端字节序是高地址存低位;小端字节序是低地址存低位

#include<stdio.h>

int checkSys()
{
    union check
    {
        int i;
        char c;
    }cc;
    
    cc.i = 1;

    return cc.c;
}

int main()
{
    printf("%d\n",checkSys());    //输出1

    return 0;
}

我的window系统时小端存储的;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值