- C 語言中的 srtuct 能夠看做變量的集合
struct 的問題 : 空結構體佔用多大內存?編程
void code() { struct TS { }; printf("%d\n", sizof(struct TS)); }
#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\n", sizeof(t1), &t1); printf("sizeof(t2) = %d\n", sizeof(t1), &t2); return 0 }
輸出:【GCC】 sizeof(struct TS) = 0 sizeof(t1) = 0 sizeof(t2) = 0
C 語言的灰色地帶:不一樣編譯器有不一樣的行爲數組
- GCC 大小爲 0
- BCC, VC 報錯
struct SoftArray { int len; int array[]; // 當且僅看成爲結構體的最後一個元素時能夠使用 }; // ... struct SoftArray* sa = NULL; sa = (struct SoftArray*)malloc(sizeof(struct SoftArray) + sizeof(int) * 5)); sa->len = 5; printf("%d\n", sizeof(struct SoftArray)); // 4
#include <stdio.h> #include <malloc.h> struct SoftArray { int len; int array[]; }; struct SoftArray* creat_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( sa != NULL ) { for(i=0; i<sa->len; i++) { sa->array[i] = i + 1; } } } int main() { int i = 0; struct SoftArray* sa = creat_soft_array(10); func(sa); for(i=0; i<sa->len; i++) { printf("%d\n", sa->array[i]); } delete_soft_array(sa); return 0; }
輸出: 1 2 3 4 5 6 7 8 9 10
- C 語言中的 union 在語法上與 struct 類似
- union 只分配最大成員的空間,全部成員共享這個空間
void code_1() { struct A { int a; int b; int c; } printf("%d\n", sizeof(struct A)); // 12 } void code_2() { union B { int a; int b; int c; } printf("%d\n", sizeof(union B)); // 4 }
union 的使用受系統大小端的影響spa
- 小端,低字節在低地址
- 大端,低字節在高地址
void code() { union C { int i; char c; }; union C c; c.i = 1; printf("%d\n", c.c); // ? }
int system_mode() { union SM { int i; char c; }; union SM sm; sm.i = 1; return sm.c; } int main() { printf("System Mode: %d\n", system_mode()); return 0; }
輸出:低字節在低地址,小端 System Mode: 1
- strut 中的每一個數據成員有獨立的存儲空間
- strut 能夠經過最後的數組標識符產生柔性數組
- union 中的全部數據成員共享一個存儲空間
- union 的使用會受到系統大小端的一影響
以上內容參考狄泰軟件學院系列課程,請你們保護原創!code