日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2-结构体的最后一个成员的定义-C语言中的柔性数组-

發布時間:2025/3/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2-结构体的最后一个成员的定义-C语言中的柔性数组- 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

深入淺出C語言中的柔性數組

在日常的編程中,有時候需要在結構體中存放一個長度動態的字符串,一般的做法,是在結構體中定義一個指針成員,這個指針成員指向該字符串所在的動態內存空間,例如:

[cpp]?view plaincopy print?
  • typedef?struct?test????
  • {????
  • ???????int?a;????
  • ???????double?b;????
  • ???????char?*p;????
  • };??
  • p指向字符串。這種方法造成字符串與結構體是分離的,不利于操作。如果把字符串跟結構體直接連在一起,不是更好嗎?于是,可以把代碼修改為這樣:

    [cpp]?view plaincopy print?
  • char?a[]?=?"hello?world";??
  • test?*stpTest?=?(test?*)malloc(sizeof(test)?+?strlen(?a?)?+?1?);??
  • strcpy(stpTest?+?1,?a?);??
  • 這樣一來,( char* )(stpTest + 1 )就是字符串"hello world"的地址了。這時候p成了多余的東西,可以去掉。但是,又產生了另外一個問題:老是使用( char* )((stpTest + 1 )不方便。如果能夠找出一種方法,既能直接引用該字符串,又不占用結構體的空間,就完美了,符合這種條件的代碼結構應該是一個非對象的符號地址,在結構體的尾部放置一個0長度的數組是一個絕妙的解決方案。不過,C/C++標準規定不能定義長度為0的數組,因此,有些編譯器就把0長度的數組成員作為自己的非標準擴展
    在講述柔性數組成員之前,首先要介紹一下不完整類型(incomplete type)。不完整類型是這樣一種類型,它缺乏足夠的信息例如長度去描述一個完整的對象,

    它的出現反映了C程序員對精煉代碼的極致追求這種代碼結構產生于對動態結構體的需求。

    鑒于這種代碼結構所產生的重要作用,C99甚至把它收入了標準中。C99使用不完整類型實現柔性數組成員,在C99 中,結構中的最后一個元素允許是未知大小的數組,這就叫做柔性數組(flexible array)成員(也叫伸縮性數組成員),但結構中的柔性數組成員前面必須至少一個其他成員。柔性數組成員允許結構中包含一個大小可變的數組。柔性數組成員只作為一個符號地址存在,而且必須是結構體的最后一個成員,sizeof 返回的這種結構大小不包括柔性數組的內存。柔性數組成員不僅可以用于字符數組,還可以是元素為其它類型的數組。包含柔性數組成員的結構用malloc ()函數進行內存的動態分配,并且分配的內存應該大于結構的大小,以適應柔性數組的預期大小。柔性數組的使用請看下面的例子:

    [cpp]?view plaincopy print?
  • typedef?struct?test??
  • {??
  • ????int?a;??
  • ????double?b;??
  • ????char?c[0];??
  • };??
  • 有些編譯器會報錯無法編譯可以改成:

    [cpp]?view plaincopy print?
  • typedef?struct?test??
  • {??
  • ????int?a;??
  • ????double?b;??
  • ????char?c[];??
  • };??
  • 通過如下表達式給結構體分配內存:

    [cpp]?view plaincopy print?
  • test?*stpTest?=?(test?*)malloc(sizeof(test)+100*sizeof(char));??
  • c就是一個柔性數組成員,如果把stpTest指向的動態分配內存看作一個整體,c就是一個長度可以動態變化的結構體成員,柔性一詞來源于此。c的長度為0,因此它不占用test的空間,同時stpTest->c就是“hello world”的首地址,不需要再使用( char * )( stpTest + 1 )這么丑陋的代碼了。那個0個元素的數組沒有占用空間,而后我們可以進行變長操作了。這樣我們為結構體指針c分配了一塊內存。用stpTest->c[n]就能簡單地訪問可變長元素。

    當然,上面既然用malloc 函數分配了內存,肯定就需要用free 函數來釋放內存:

    [cpp]?view plaincopy print?
  • free(stpTest);??
  • 應當盡量使用標準形式,在非C99的場合,可以使用指針方法。需要說明的是:C89不支持這種東西,C99把它作為一種特例加入了標準。但是,C99所支持的是incomplete type,而不是zero array,形同int a[0];這種形式是非法的,C99 支持的形式是形同int a[];只不過有些編譯器把int a[0];作為非標準擴展來支持,而且在C99 發布之前已經有了這種非標準擴展了,C99 發布之后,有些編譯器把兩者合而為一了。

    總結

    以上是生活随笔為你收集整理的2-结构体的最后一个成员的定义-C语言中的柔性数组-的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。