1 struct 关键字
-
C语言中的
struct
可以看作变量的集合 -
问题:空结构体占用多大内存?
-
Demo
#include <stdio.h> struct TS { }; int main() { struct TS t1,t2; printf("sizeof(struct TS) = %d ",sizeof(struct TS)); printf("sizeof(t1) = %d ,&t1 = %p ",sizeof(t1),&t1); printf("sizeof(t2) = %d ,&t2 = %p ",sizeof(t2),&t2); return 0; }
-
GCC 编译运行
sizeof(struct TS) = 0 sizeof(t1) = 0,&t1 = 0xbfb19e30 sizeof(t2) = 0,&t2 = 0xbfb19e30
-
VS编译:不允许有空结构体的存在
-
2 结构体与柔性数组
-
柔性数组即数组大小待定的数组
-
C 语言中可以由结构体产生柔性数组(带有长度的数组)
-
C 语言中结构体的最后一个元素可以是大小未知的数组
-
示例
- 结构体
SoftArray
中的array
数组变量仅是一个待使用的标识符,不占用存储空间
#include <stdio.h> struct SoftArray { int len; // 标识柔性数组的大小 int array[]; // 柔性数组 } int main() { printf("sizeof(struct SoftArray) = %d ",sizeof(struct SoftArray)); //4 return 0; }
- 结构体
-
柔性数组的用法
array
数组虽然没有指定大小,但可以在使用的时候利用malloc
函数指定其大小
#include <stdio.h> #include <malloc.h> struct SoftArray { int len; int array[]; }; //动态创建柔性数组,大小可变 struct SoftArray* create_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 delete_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; //创建一个柔性数组,大小为10 struct SoftArray* sa = create_soft_array(10); //对柔性数组每个成员进行赋值 func(sa); for(i=0; i<sa->len; i++) { printf("%d,", sa->array[i]); // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, } delete_soft_array(sa); return 0; }
3 union 关键字
-
C 语言中的
union
在语法上与struct
相似 -
union
只分配最大成员的空间,所有成员共享这个空间#include <stdio.h> struct A { int a; int b; int c; }; union B { int a; int b; int c; } int main() { printf("%d ",sizeof(struct A)); // 12 printf("%d ",sizeof(union B)); // 4 return 0; }
-
union
的使用受系统大小端的影响- 小端模式:低地址存储低位数据,大端模式:低地址存储高位数据
-
示例:编程判断系统的大小端
- 小端模式:由于变量
c
只占用一个字节,取出地址中低地址的一个字节,输出 1 - 大端模式:输出 0
#include <stdio.h> int system_mode() { //最大内存:4字节 union SM { int i; char c; }; union SM sm; sm.i = 1; return sm.c; } int main() { printf("System Mode: %d ", system_mode()); //1 => 小端模式 return 0; }
- 小端模式:由于变量