空结构体占用的内存多大?
1 struct d 2 { 3 4 }; 5 6 int main() 7 8 { 9 10 struct d d1; 11 12 struct d d2; 13 14 printf("%d,%0x\n",sizeof(d1),&d1); //求内存大小,及结构体变量的地址 15 printf("%d,%0x\n",sizeof(d1),&d2); 16 17 }
不同的编译器,分配的大小不一样,一般取0个字节或1个字节。
柔性数组:数组大小待定的数组,C语言中结构体最后一个元素可以是大小未知的数组,C语言中可以由结构体产生柔性数组:
1 struct softarray 2 3 { 4 5 int len; 6 7 int array[]; 8 9 };
那么这个结构体的大小是多少? 最后的未知大小的数组处理为0个字节,所以说整个结构体变量的空间就是其他变量的空间之和。
1 typedef struct _soft_array 2 { 3 int len; 4 int array[]; 5 }SoftArray; 6 7 int main() 8 { 9 int i = 0; 10 SoftArray* sa = (SoftArray*)malloc(sizeof(SoftArray) + sizeof(int) * 10); 11 12 sa->len = 10; 13 14 for(i=0; i<sa->len; i++) 15 { 16 sa->array[i] = i + 1; 17 } 18 19 for(i=0; i<sa->len; i++) 20 { 21 printf("%d\n", sa->array[i]); 22 } 23 24 free(sa); 25 26 return 0; 27 }
struct中每个域都在内存中分配空间;union只分配最大域的空间,所有域共享这个空间;union受系统大小端的影响:
大端模式:内存的高地址位存放数据的高字节
小端模式:内存的低地址位存放数据的高字节
1 union c 2 3 { 4 5 int i; 6 7 char cc; 8 9 } // 分配最大域空间,即4个字节 10 11 union c abc; 12 13 c.i=1; 14 15 printf("%d\n",c.cc); //大端模式:0,小端模式:1
enum:
是一种自定义类型,默认的常量的值均为整数,且第一个常量取值为0(如果不指定),其后的每一个常量均是在该常量前一个常量前加1,enum类型的变量只能取离散的值:
1 enum color 3 { 5 green, 7 red=2, 9 blue, 11 black 13 }; 14 enum color c =green; 15 printf("%d\n",c); //0 16 enum color c =blue; 17 printf("%d\n",c); //3 18 enum color c =black; 19 printf("%d\n",c); //4
枚举类型和#define的区别:
#define 宏常量只是简单的进行值替换,枚举常量是真正意义上的常量
#define 宏常量美誉类型信息,enum是一种变量类型
typedf:
用来给一个已经存在的数据类型重命名,并没有产生新的类型,typedef重定义的类型不能进行unsigned和signed扩展。
typedef与#define的区别:
1 typedef char* path; 2 path p1,p2; //相当于char* p1,char* p2 3 #define path char*; 4 path p1,p2; // 相当于 char * p1,char p2
时间: 2024-11-09 11:41:26