C語言中結構體的最後一個元素可以是大小未知的數組
C語言中可以由結構體產生柔性數組
typedef struct _soft_array
{
int len;
int 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++)
{
sa->array[i] = i + 1;
}
for(i=0; ilen; i++)
{
printf("%d\n", sa->array[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