C语言关键字--- struct union

空结构体占的空间有多大呢

#include 

struct _null
{

};

int main()
{
	struct _null n1;
	struct _null n2;

	printf("%d \n",sizeof(struct _null));
	printf("%d, %0x \n",sizeof(n1),&n1);
	printf("%d, %0x \n",sizeof(n2),&n2);
}
[root@localhost C]# gcc struct.c 
[root@localhost C]# ./a.out 
0 
0, bfe01984 
0, bfe01984 
[root@localhost C]# g++ struct.c 
[root@localhost C]# ./a.out 
1 
1, bff87f63 
1, bff87f62 
[root@localhost C]# 

可以看到 gcc 编译出来的结果空结构体是所占的空间为0,两个变量的起始地点重叠 .

g++ 编译出来的结果空结构体是所占的空间为1,两个变量的起始地点不重叠 .

这没有什么对错,只是g++ 更合理些.


柔性数组:

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

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

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

struct softArray
{
    int len;
    int array[];

};

下面是示例代码:

#include 

typedef struct _soft_array
{
	int len;
	int array[];
}softArray;

int main()
{
	printf("%d \n",sizeof(softArray));
}
[root@localhost C]# ./a.out 
4 
[root@localhost C]# 


可以看出编译器给这个结构体分配的空间只有前面 int 的4个字节空间,

 后面的 array 数组没有分配空间,我们可以把它当作是占位符,可以再后面再分配任意的空间给这个数组.

#include 
#include 

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]);
	}
	printf("\n");
	free(sa);

	return 0;
}
[root@localhost C]# ./a.out 
1 2 3 4 5 6 7 8 9 10 
[root@localhost C]# 

使用柔性数组对斐波拉茨数列求和

前10:

#include 
#include 

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

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 = 0;
    
    if( NULL != sa )
    {
        if( 1 == sa->len )
        {
           sa->array[0] = 1;
        }
        else 
        {
            sa->array[0] = 1;
            sa->array[1] = 1;
            
            for(i=2; ilen; i++)
            {
                sa->array[i] = sa->array[i-1] + sa->array[i-2];
            }
        }
    } 
}

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

int main()
{
    int i = 0;
    SoftArray* sa = create_soft_array(10);
    
    fac(sa);
    
    for(i=0; ilen; i++)
    {
        printf("%d\n", sa->array[i]);
    }
    
    delete_soft_array(sa);
    
    return 0;
}
[root@localhost C]# ./a.out 
1
1
2
3
5
8
13
21
34
55
[root@localhost C]# 

union 与 struct 区别:

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

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

#include 

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

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

int main()
{
	printf("%d \n",sizeof(struct A));
	printf("%d \n",sizeof(union B));
	return 0;
}
[root@localhost C]# ./a.out 
12 
4 
[root@localhost C]# 

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

int i = 1;

大端模式   0x0  0x0  0x0  0x1

                    --------------> 高地址

小端模式   0x0  0x0  0x0  0x1

                    高地址 <-------------- 


那么我们 可以通过这一特点来确定我们的系统的大小端模式:

#include 

int checkSys()
{
	union check
	{
		int i;
		char c;
	}cc;
	cc.i = 1;
	return cc.c == 1;//判断是否等于1  等于返回1 不等于返回0;
}

int main()
{
	printf("%d \n",checkSys());
	return 0;
}
[root@localhost C]# ./a.out 
1 
[root@localhost C]# 
可以推出我们的系统是小端模式.





你可能感兴趣的:(C,学,习)