C语言进阶:10、struct和union分析

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

    问题:空结构体占多大内存?

#include<stdio.h>

struct TS
{

};

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

在linux下使用Gcc进行编译运行:

sizeof(TS) = 0
sizeof(t1) = 0, &t1 = 0xbf963630
sizeof(t1) = 0, &t2 = 0xbf963630

但是在Bcc编译器下,会直接报错。//编译器认为,结构体的存在就是为了存放不同的数据类型。

结构体和柔性数组:

    柔性数组即数组大小待定的数组;

    C语言中可以由结构体产生柔性数组;

    C语言中结构体的最后一个元素可以是大小未知的元素。

struct SoftArray
{
	int len;
	int array[];       -->>  sizeof(struct SoftArray) = ???
}

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

printf("sizeof(struct SoftArray) = %d\n", sizeof(struct SoftArray));
sizeof(struct SoftArray) = 4

柔性数组的用法:  

struct SoftArray sa* = NULL;

sa = (struc SoftArray*)malloc(sizeof(struct SoftArray) + sizeof(int)*5);

sa->len = 5;   //带长度信息的数组,也就是说,可以使用柔性数组得到数组的长度信息。
sa->array;    //动态申请的空间

观察下面代码,体会柔性数组的使用:

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

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

struct SoftArray* creat_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 del_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 = creat_soft_array(10);
	
	func(sa);
	
	for(i=0; i<sa->len; i++)
	{
		printf("sa->array[] =  %d\n", sa->array[i]);
	}
	
	del_soft_array(sa);
	
	return 0;
}
C语言中的union:
union只分配最大成员的空间,所有成员共享这个空间。
union B
{
	int a;
	int b;
	int c;
};
union的使用会受到系统大小端的影响:
小端: 低地址存储在低位
大端: 低地址存储在高位
union C
{
	int i;
	char c; //低地址上取数据
};

union C c;

c.i=1;

printf("%d\n", c.c); //??  小端为1,大端为0;

利用这个特性,可以检测系统的大小端:


#include <stdio.h>

int system_mode()
{
    union UN
    {
        int i;
        char c;
    };
    
    union UN cn;
    
    cn.i = 1;
    
    return cn.c;

}

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

小结:

    struct中的每个数据成员都有独立的存储空间

    struct可以通过最后的数组标识符产生柔性数组

    union中的所有数组共享同一个存储空间

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值