C語言變長陣列data 0 總結

2021-08-02 12:47:50 字數 1727 閱讀 2339

1、前言

今天在看**中遇到乙個結構中包含char data[0],第一次見到時感覺很奇怪,陣列的長度怎麼可以為零呢?於是上網搜尋一下這樣的用法的目的,發現在linux核心中,結構體中經常用到data[0]。這樣設計的目的是讓陣列長度是可變的,根據需要進行分配。方便操作,節省空間。

2、data[0]結構

經常遇到的結構形狀如下:

struct

buffer

;

在這個結構中,data是乙個陣列名;但該陣列沒有元素;該陣列的真實位址緊隨結構體buffer之後,而這個位址就是結構體後面資料的位址(如果給這個結構體分配的內容大於這個結構體實際大小,後面多餘的部分就是這個data的內容);這種宣告方法可以巧妙的實現c語言裡的陣列擴充套件。

寫個程式對比char data[0],char *data, char data,如下所示:

從結果可以看出data[0]和data不占用空間,且位址緊跟在結構後面,而char *data作為指標,占用4個位元組,位址不在結構之後。

3、實際當中的用法

在實際程式中,資料的長度很多是未知的,這樣通過變長的陣列可以方便的節省空間。對指標操作,方便資料型別的轉換。測試程式如下:

1 #include 2 #include 3 #include 

4 #include 5

6 typedef struct

7buff_st_1;

1112 typedef struct

13buff_st_2;

1718 typedef struct

19buff_st_3;

2324 typedef struct

25student_st;

2930

31void print_stu(const student_st *stu)

3235

36int

main()

37

程式執行結果如下:

採用char *data,需要進行二次分配,操作比較麻煩,很容易造成記憶體洩漏。而直接採用變長的陣列,只需要分配一次,然後進行取值即可以。

冷靜思考,勇敢面對,把握未來!

分類: 

c/c++語言

好文要頂

關注我收藏該文

anker's blog

關注 - 15

粉絲 - 907

+加關注5 0

windows無法訪問vmware搭建好虛擬機器linux web伺服器

採用dlopen、dlsym、dlclose載入動態鏈結庫【總結】

posted @ 

2014-05-21 23:25

anker's blog 閱讀(

9) 編輯收藏

C語言變長陣列data 0 總結

1 前言 今天在看 中遇到乙個結構中包含char data 0 第一次見到時感覺很奇怪,陣列的長度怎麼可以為零呢?於是上網搜尋一下這樣的用法的目的,發現在linux核心中,結構體中經常用到data 0 這樣設計的目的是讓陣列長度是可變的,根據需要進行分配。方便操作,節省空間。2 data 0 結構 ...

C語言變長陣列data 0 總結

1 前言 今天在看 中遇到乙個結構中包含char data 0 第一次見到時感覺很奇怪,陣列的長度怎麼可以為零呢?於是上網搜尋一下這樣的用法的目的,發現在linux核心中,結構體中經常用到data 0 這樣設計的目的是讓陣列長度是可變的,根據需要進行分配。方便操作,節省空間。2 data 0 結構 ...

C語言變長陣列data 0 總結

1 前言 今天在看 中遇到乙個結構中包含char data 0 第一次見到時感覺很奇怪,陣列的長度怎麼可以為零呢?於是上網搜尋一下這樣的用法的目的,發現在linux核心中,結構體中經常用到data 0 這樣設計的目的是讓陣列長度是可變的,根據需要進行分配。方便操作,節省空間。2 data 0 結構 ...