本博客记录狄泰学院课程的学习
学习交流群:320628659
个人QQ:1367087622
欢迎大家交流学习
本章的学习目标:
struct和union还有enum, sizeof, typedef 的学习分析
学习这些关键字的意义以及使用
struct、union、enum、sizeof、typedef
struct和union
struct(结构体类型)
-
在C语言中的struct可以看作是变量的集合,管理一系列互相相关的变量.
-
struct中的每个数据成员用独立的存储空间,与union所有成员共享一片内存有所区别。
-
struct的问题:
-
空结构体占用多少内存?
-
struct TS{ ⇒ sizeof(struct TS) = ?
};
既然好奇,那就用代码编译试试
-
//test.c
#include <stdio.h>
struct TS
{
};
int main()
{
struct TS t1;
struct TS t2;
printf("sizeof(struct TS) = %d\n", sizeof(struct TS));
printf("sizeof(t1) = %d, &t1 = %p\n", sizeof(t1), &t1);
printf("sizeof(t2) = %d, &t2 = %p\n", sizeof(t2), &t2);
return 0;
}
在gcc 4.4.5 编译器
结果为
delphi@delphi-vm:~$ gcc test.c
delphi@delphi-vm:~$ ./a.out
sizeof(struct TS) = 0
sizeof(t1) = 0, &t1 = 0xbfb8ca20
sizeof(t2) = 0, &t2 = 0xbfb8ca20在VC10.0 编译器
结果为
E:\> cl test.c
E:\> test.c <7> : error :C requires that a struct or union has at least one number
错误信息表明 在C语言中的struct 和 union 最少要有1个成员。
这两种现象都是对的,因为一个空的结构体没有任何意义,在历史上也没有规定到底是该选择哪种处理方式,所以这两者编译器的处理都是正确的
结构体与柔性数组
-
柔性数组即数组大小待定的数组
-
C语言中可以由结构体产生柔性数组
-
C语言中结构体的最后一个元素可以是大小未知的数组
struct SoftArray
{
int len; ⇒ sizeof(struct SoftArray) = ???
int array[];
};
SoftArray中的array只是待使用的标识符并不占用内存空间
上代码
#include <stdio.h>
struct SoftArray
{
int len;
int array[];
};
int main()
{
printf("sizeof(struct SoftArray )= %d\n", sizeof(struct SoftArray));
return 0;
}
结果为
delphi@delphi-vm:~$ gcc test.c
delphi@delphi-vm:~$ ./a.out
sizeof(struct SoftArray )= 4
结果很明显只有int len的大小,那么该怎么使用柔性数组呢&#x