C99新增的柔性陣列

2021-08-02 18:27:30 字數 1611 閱讀 9308

我總結了一下用指標和用變長結構體的區別:

1.在位置方面:指標可以放在任何地方,但是變長結構體的變長部分一定要放在結構體的最後。

2.在記憶體占用方面:指標會佔乙個指標的大小的記憶體空間,但是變長陣列是不佔記憶體的,它只是乙個佔位符。

3.在記憶體布局方面:指標指向的記憶體和結構體的記憶體可以是不連續的,但是變長部分和結構體的記憶體必須是連續。

4.在記憶體釋放方面:使用指標,就要先釋放指標所指的內存在釋放整個結構體的記憶體,否則會照成記憶體洩露。

但是使用變長結構體直接釋放整個結構體的空間就可以了

5.乙個限制:指標可以用在c++的類中,但是變長結構體就不可以了。因為有些編譯器會將一些額外的資訊放在類的最後,

比如vptr或者虛基類的內容,使用了變長的類,就會把這部分的值改變,這種行為是未定義的,誰也不知道會發生什麼。

(以上引用別人的,我覺得很好啊)

柔性陣列(flexible array)也叫伸縮性陣列,也就是變長陣列

這種**結構產生於對動態結構體的需求,

比如我們需要在結構體中存放乙個動態長度的字串時,就可以用柔性陣列。

c99使用不完整型別來實現柔性陣列,標準形式如下:

標識佔位符(不佔結構struct的空間)

c99使用不完整型別實現柔性陣列成員,標準形式是這樣的:

struct test

;c同樣不占用test的空間,只作為乙個符號位址存在,而且必須是結構體的最後乙個成員。柔性陣列成員不僅可以用於字元陣列,還可以是元素為其它型別的陣列:

示例**:

#include 

using namespace std;

struct a;

int main()

for(int i=0;i

w[i]<<" ";

}delete p;

return 0;

}

結果: 4

0 1 2 3 4

類中帶有該種結構體:

#include 

using namespace std;

struct a;

class b;

int main()

for(int i=0;i

r.w[i]<<" ";

}delete p;

return 0;

}

結果正常;

但交換b中資料成員位置:

會崩潰,符合最開始第五條的說明,使用codeblock

mingw下

#include 

using namespace std;

struct a;

class b;

int main()

for(int i=0;i

r.w[i]<<" ";

}delete p;

return 0;

}

linux中 不定長陣列 柔性陣列(c99支援)

free a 只是將指標a指向的連續記憶體區域,標記為可被再分配。malloc 和 free是在heap中,記錄了分配的記憶體起始位址和長度。實現過程,參照支援c庫的os系統。struct example attribute packed 與struct example attribute pack...

C99中的變長陣列(VLA)

處理二維陣列的函式有一處可能不太容易理解,陣列的行可以在函式呼叫的時候傳遞,但是陣列的列卻只能被預置在函式內部。例如下面這樣的定義 define cols 4 int sum3d int ar cols int rows 現在假定了如下的陣列 int array1 5 4 int array2 10...

c99變長陣列 第九章 C99可變長陣列VLA詳解

c90及c 的陣列物件定義是靜態聯編的,在編譯期就必須給定物件的完整資訊。但在程式設計過程中,我們常常遇到需要根據上下文環境來定義陣列的情況,在執行期才能確知陣列的長度。對於這種情況,c90及c 沒有什麼很好的辦法去解決 stl的方法除外 只能在堆中建立乙個記憶體映像與需求陣列一樣的替代品,這種替代...