空數組

空數組

一個長度為0的數組我們稱之為“空數組”,空數組是一個真正的對象,只是包含元素個數為0。 null數組是一個空引用。 假設一個方法返回一個數組,如果它返回null,則調用方法必須先判斷是否返回null,才能對返回數組進一步處理,而如果返回空數組,則無須null引用檢查。鑒於此,返回數組的方法在沒有結果時我們通常返回空數組,而不是null,這樣處理比較方便。

空數組即下標為0的數組,如a[0]。在函式中聲明空數組是沒有任何意義的,當然也編譯不過。而在類或結構體中,是可以這樣聲明的。

struct ast_exten {

char *exten;

char stuff[0];

};

又如:

struct ast_include {

char *name;

char *rname;

char stuff[0];

};

struct ast_ignorepat {

const char *registrar;

struct ast_ignorepat *next;

char pattern[0];

};

這是個廣泛使用的常見技巧,常用來構成緩衝區。比起指針,用空數組有這樣的優勢:

1.不需要初始化,數組名直接就是所在的偏移

2.不占任何空間,指針需要占用int長度空間,空數組不占任何空間。

“這個數組不占用任何記憶體”,意味著這樣的結構節省空間;“該數組的記憶體地址就和他後面的元素的地址相同”,意味著無需初始化,數組名就是後面元素的地址,直接就能當做指針使用。

這樣的寫法最適合製作動態buffer。因為可以這樣分配空間:

malloc(sizeof(struct XXX)+ buff_len);

看出來好處沒有?直接就把buffer的結構體和緩衝區一塊分配了。用起來也非常方便,因為現在空數組其實變成了buff_len長度的數組了。

這樣的好處是:

一次分配解決問題,省了不少麻煩。大家知道為了防止記憶體泄漏,如果是分兩次分配(結構體和緩衝區),那么要是第二次malloc失敗了,必須回滾釋放第一個分配的結構體。這樣帶來了編碼麻煩。其次,分配了第二個緩衝區以後,如果結構裡面用的是指針,還要為這個指針賦值。同樣,在free這個buffer的時候,用指針也要兩次free。如果用空數組,所有問題一次解決。

其次,大家知道小記憶體的管理是非常困難的,如果用指針,這個buffer的struct部分就是小記憶體了,在系統記憶體在多了勢必嚴重影響記憶體管理的性能。要是用空數組把struct和實際數據緩衝區一次分配大塊問題,就沒有這個問題。

如此看來,用空數組既簡化編碼,又解決了小記憶體碎片問題提高了性能。

相關詞條

相關搜尋

熱門詞條

聯絡我們