C語言柔性數組


1、柔性數組
    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
發佈了14 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章