我總結了一下用指標和用變長結構體的區別:
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的方法除外 只能在堆中建立乙個記憶體映像與需求陣列一樣的替代品,這種替代...