1. 空结构体?
C语言可以定义一个空结构体?
空结构体占用多大内存? O?
C语言的灰色地带 ???
#include<stdio.h>
#include<malloc.h>
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);
return 0;
}
灰色地带,不好控制.
在 linux环境下的gcc 执行会输出
0
0, BFC03F60
0, BFC03F60
在linux环境下的g++执行会输出
1
1, BFE55A7F
1, BFE55A7E
.2. 什么是柔性数组.
数组 在定义的时候,就要定义出大小.
所谓柔性数组,就是数组大小待定.
C语言中可由结构体产生柔性数组.
C语言中的结构体的最后一个元素可以是在小未知的数组.
#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); //在堆上分配空间
printf("sizeof(SoftArray)= %d\n", sizeof(SoftArray));
sa->len = 10;
for(i=0; i<sa->len; i++)
{
sa->array[i] = i + 1;
}
for(i=0; i<sa->len; i++)
{
printf("%d\n", sa->array[i]);
}
free(sa);
return 0;
}
#include <stdio.h>
#include <malloc.h>
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; i<sa->len; 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; i<sa->len; i++)
{
printf("%d\n", sa->array[i]);
}
delete_soft_array(sa);
return 0;
}
3.union
union只分配最大域的空间.
注意点union的使用受系统大小端的影响.
union C
{
int i;
char c;
};
union C c;
c.i =1;
printf( "%d\n" ,c.c); //大端 打印0, 小端模式 打印1.
使用unino判断系统的大小端模式.
#include <stdio.h>
int checkSys(void)
{
union check
{
int i;
char c;
}cc;
cc.i=1;
return cc.c ==1;
}
int main()
{
if(checkSys())
{
printf("%d\n" ,checkSys());
printf("Little-endian mode\n"); //小端模式 ,低位存在低字节,高位存在高字节
}
else
{
printf("%d\n" ,checkSys());
printf("Big-endian mode\n"); //大端模式,低位存在高字节,高位存在低字节
}
return 0;
}