柔性數組

1、如何在一個結構體中動態存放動態字符串

在瞭解柔性數組之前,我們先考慮這個問題,通常我們要想在結構體中存放一個動態長度字符串主要有以下兩種方法:
(1)在結構體中定義一個指針,讓該指針指向字符串的動態地址空間
(2)定義一個結構體指針,將結構體和字符串鏈接在一起
以上兩種方法都可以實現,但各自有缺點:

  • 第一種方法:會造成結構體和字符串分離,此時字符串其實在代碼段放着,這樣操作起來會比較麻煩。
  • 第二種方法:這種方法雖然將結構體和字符串直接鏈接在一起了,但是實現起來會比較麻煩,需要先爲字符串數組malloc(結構體+字符串數組大小)的空間,然後再將這些數據拷貝到結構體指針指向的空間。
    那麼有沒有一種方法,在結構體中預留未知大小空間供我們動態使用呢,柔性數組就是專門解決這類問題的,我們一起來了解一下:

2、什麼是柔性數組

所謂柔性數組就是數組大小是待定的數組,也就是數組大小是可變大的。
柔性數組主要有以下幾個特點:
(1)C99 中,結構體中的最後一個元素允許是未知大小的數組,這就叫做柔性數組成員,但結構體中的柔性數組成員前面必須至少一個其他成員。
(2)柔性數組成員允許結構體包含一個大小可變的數組。
(3)sizeof求結構體的大小時,返回的內存大小不包括柔性數組的成員
(4)包含柔性數組成員的結構用malloc ()函數進行內存的動態分配,並且分配的內存應該大於結構的大小,以適應柔性數組的預期大小。

3、柔性數組的定義

我們根據柔性數組的特點可以做如下定義:

typedef struct packet{
    int len;
    int a[];//柔性數組成員
}packet;

typedef struct packet{
    int len;
    int a[0];//柔性數組成員
}packet;

這兩種方法定義都是正確的,有些編譯器可能對後一種方法無法正確編譯。
接下來我們用一個小栗子來看看柔性數組到底如何使用的:

typedef struct packet{
    int len;
    int a[];
}packet;
int main()
{
    packet tmp;//定義一個結構體對象
    //根據我們需要的大小進行空間開闢
    packet *p = (packet*)malloc(sizeof(tmp)+sizeof(int)* 10);
    cout << "packet結構體的大小爲:" << sizeof(packet) << endl;
    for (int i = 0; i < 10; i++)//如果此時柔性數組空間成功開闢,可插入數據
    {
        p->a[i] = i;
    }
    for (int i = 0; i < 10; i++)//驗證測試用例
        cout << p->a[i] << " ";
    cout << endl;
    system("pause");
    return 0;
}

運行結果:
這裏寫圖片描述
從結果,我們可以看到,該結構體的大小是4個字節,即sizeof(packet)=sizeof(int),並不包含柔性數組的大小。

發佈了115 篇原創文章 · 獲贊 74 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章