C語言柔性陣列

2021-08-31 03:15:47 字數 1027 閱讀 4276

1、柔性陣列

c語言中結構體的最後乙個元素可以是大小未知的陣列

c語言中可以由結構體產生柔性陣列

typedef struct _soft_array

softarray;

可以試試,printf("%d", sizeof(softarray));列印出它的sizeof()大小

結果是4,也就是說array這個未知長度的陣列佔了0位元組,也就是傳說中的柔性陣列。

因此 我們可以有這樣的程式了

int i = 0;

softarray* sa = (softarray*)malloc(sizeof(softarray) + sizeof(int) * 10);

sa->len = 10;

for(i=0; ilen; i++)

for(i=0; ilen; i++)

free(sa);

這樣我們為結構體指標sa分配了一塊記憶體。但是這個時候我們再用sizeof(*sa)測試結構體的大小,發現仍然是4.可見,結構體的模已經定了。而多分配出來的記憶體是又變長陣列使用。

2、const  volatile

這兩個可能知道的人會經常用,用的也非常多,但是兩個合在一起用呢?哈哈

c語言中的const 不是真正意義的定義乙個常量  而是定義了乙個唯讀變數也就是說const int i = 0;中i的本質還是變數,只是宣告為const就導致編譯器不讓這個變數出現在賦值符號左邊,但i還是有自己的記憶體空間,有自己的值。

volatile是告訴編譯器每次程式讀值的時候就到記憶體中去取值,而不要做優化。

因此const volatile int i = 0;是合法的  const告訴編譯器 這個變數i不能成為左值,並且告訴編譯器當我們使用i的值時,比如 int j = i;這個時候我們要到記憶體中拿i的值。為什麼這麼說呢,因為編譯器看到i是const的,就會認為i的值不會變了,而預設看到i就是0,其實因為i有自己的記憶體空間,所以我們可以通過硬體方式或者 直接修改它的記憶體的方式來改變i的值   如果不加volatile  那麼很可能i在記憶體中的值已經變了,但是編譯器還是認為i為0

C語言 柔性陣列

柔性陣列 flexible array 也叫伸縮性陣列,其實就是變長陣列,反映了c語言對精煉 的極致追求。這種 結構產生於對動態結構體的需求。比如我們需要在結構體中存放乙個動態長度的字串,這時候,柔性陣列可以大顯身手了。c99使用不完整型別來實現柔性陣列,標準形式如下 struct mystruct...

C語言建立柔性陣列

typedef struct softarray softarray create soft array int size return ret q ret 為null,訪問ret array為什麼沒有導致程式奔潰呢 這裡沒有訪問ret array 即沒要它的位址 只是要了array的型別。ret為...

C語言柔性陣列和動態陣列

前言 經常看到c語言裡的兩個陣列,總結一下。參考 includetypedef struct softarraysoftarray 我們可以看出,softarray結構體的大小是4,顯然,在32位作業系統下乙個int型變數大小剛好為4,也就說結構體中的陣列沒有占用記憶體。為什麼會沒有占用記憶體,我們...