c之柔性陣列成員

2021-07-30 20:07:23 字數 1796 閱讀 1180

在這裡我們來說說c語言中遇到的柔性陣列,為了能夠更好的讓讀者理解柔性陣列,在了解柔性陣列之前我們先通過理解不完整型別來引入柔性陣列的概念。在此之前應該沒有那本數會完整的介紹不完整型別,所以大家讀到不完整型別的時候都會感覺到腦空白一片,但其實我們在程式中會經常遇到不完整型別,下面我們舉例來說明什麼是柔性陣列。

1、不完整型別:

很多任務程中經常會使用到不完整型別,例如:

struct test;

void move(int,int);

extern int a;

a、void move(int,int)和test在這裡只給出了宣告並沒有給出定義,不完整型別必須通過某些方式補充完整之後才能使用它進行定義變數,否則只能用於定義指標或引用。上面的三種情況分別是對結構體、函式、陣列的進行了宣告,如果我們通過函式來呼叫的話就像下面這樣:

#include

struct test;

void move(int,int);

extern

int a;

int main()

如果這樣寫,只進行編譯不進行鏈結的時候,不會報錯,如果程式進行鏈結或者執行的時候就會出錯,因為**在上面只進行了宣告,相當於告訴編譯器這些型別是存在的,但具體型別是什麼我也不知道,編譯器無需知道具體的定義型別是什麼,只需要知道這個型別存在就行,在執行的時候,就必須定義出型別的真實部分,讓程式可以找到宣告的型別主體,知道怎麼執行,這就是為什麼編譯不會報錯而執行會報錯的原因。上面的三種例子就是不完整型別。接下來我們來看看柔性資料具體是什麼東東。

2、柔性陣列成員:

柔性陣列成員也叫伸縮性陣列成員,在平時的變成中會在結構體中放乙個動態變化的字串,下面我們來看看**是怎麼實現的:

#include

struct test

;int main()

**這樣寫雖然可以通過結構體中的字串指針對指標sr所指向的字串進行管理,但這種做法會造成兩種不良影響,一是字串本身和所管理的結構體分離,不利於操作,二是pc指標策劃年港元要占用相應的空間,如果能把字串跟結構體直接連線在一起進行操作,並且想辦法讓結構的空間盡可能的小,那樣更好,我們修改**:

#include

#include

#include

struct test

; int main()

這樣,(char*)(pt+1)就是字串「hello world!」的位址,這時候結構體中的pc成員成了多餘的東西,可以直接去掉,不過會產生另外乙個問題就是(char*)(pt+1)表示字串多少不美觀,也不太方便,如果找一種方法既能直接引用該字串,有不占用結構體空間那該多好,符合這種條件的**結構應該是乙個非常的符號位址,在結構體尾部防止乙個長度為0的陣列是乙個絕妙的解決方案。就像下面:

#include

#include

#include

struct test

;int main()

柔性陣列的關鍵所在:

(1)必須是結構體最後乙個成員,而且結構體中只能有乙個;

(2)柔性陣列成員不佔空間;

(3)柔性陣列成員所管理的字串一定是在棧區,並且位置剛好位與結構體變數的下方,這樣才能保證不占用空間的字元符號剛好就是字串的首位址;

(4)之所以被稱作柔性陣列成員,其柔性變現為所管理的字串長度可以動態變化,而無需對所管理的結構體進行修改,成員特性表現為這種方式的定義一定只能以成員方式出現在結構體中。

使用者 組 成員

etc passwd 使用者名稱路經 useradd 建立使用者名稱 su 切換使用者 u 使用者id d 家目錄路徑 g 附加組 s 登入shell usermod 修改使用者屬性 u 使用者id d 家目錄路徑 g 附加組 s 登入shell usermod u 1700 d mnt abc g...

JSON陣列成員反序列化

場景 構想客戶端能夠傳遞如下格式json字串到服務端 分析 這是乙個擁有陣列成員物件的json字串 服務端針對json格式建立相應物件 public class keyvalue public string value public int encode public dictionarytodic...

c柔性陣列結構成員

c99中,結構中的最後乙個元素允許是未知大小的陣列,這就叫做柔性陣列成員,但結構中的柔性陣列成員前面必須至少乙個其他成員。柔性陣列成員允許結構中包含乙個大小可變的陣列。sizeof返回的這種結構大小不包括柔性陣列的記憶體。包含柔性陣列成員的結構用malloc 函式進行記憶體的動態分配,並且分配的記憶...