#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]#
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]#
后面的 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]#
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]#
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]#
可以推出我们的系统是小端模式.