前言:柔性數組是C99中新添加的概念,它是結構體里面的最后一個成員,因為它的大小未知,所以很靈活,稱之為柔
1 柔性數組占不占結構體的空間呢?
? ?不占
typedef struct Stu
{char y;int x;int arr[];//有些編譯器不支持這樣寫,可以寫成int arr[0],這個就是柔性數組
}St;
int main()
{//這里我們可以計算一下柔性數組到底計不計算空間printf("%d", sizeof(St));//這里涉及結構體的位段后面再說return 0;
}
我們看到結構體的大小是8,所以柔性數組是不占空間的
2 柔性數組怎么用
用動態內存開辟的方式用,我們來結合昨天的動態內存管理設計一下程序
typedef struct Stu
{char y;int x;int arr[];//有些編譯器不支持這樣寫,可以寫成int arr[0],這個就是柔性數組
}St;
int main()
{//這里我們可以計算一下柔性數組到底計不計算空間printf("%d\n", sizeof(St));//這里涉及結構體的位段后面再說St s = { 0 };St* p = NULL;p = &s;p = (St*)malloc(sizeof(int) * 10+sizeof(St));if (p == NULL)return 0;for (int i = 0; i < 10; i++){p->arr[i] = i;printf("%d ", p->arr[i]);}//如果后面要多開辟空間的話p = (St*)realloc(p,sizeof(int) * 15 + sizeof(St));for (int i = 10; i < 15; i++){p->arr[i] = i;printf("%d ", p->arr[i]);}free(p);p = NULL;return 0;
}
3 柔性數組的一種模擬實現(有缺陷,總的來說還是柔性數組好用)
因為柔性數組只需要釋放一次堆區內存,并且柔性數組不占用結構體內存
typedef struct Stu
{char y;int x;int* arr;
}St;int main()
{printf("%d\n", sizeof(St));//指針占用內存空間//先給結構體開辟空間St* p = (St*)malloc(sizeof(St));//然后指針指向的空間開辟p->arr = (int*)malloc(sizeof(int) * 10);//判斷是否為空if (p == NULL || p->arr == NULL)return 1;//不為空繼續下面的程序p->x = 1;p->y = 'w';for (int i = 0; i < 10; i++){p->arr[i] = i;printf("%d ", p->arr[i]);}//用完后記得釋放內存,先釋放小的,再釋放大的//如果你先釋放大的話,那么指針arr沒有了,怎么找arr指向的那塊空間呢?free(p->arr);free(p);//然后置空p->arr = NULL;p = NULL;return 0;
}