長度為0的陣列——c語言的非標準用法之一
在標準c和c++中,長度為0的陣列是被禁止使用的。不過在gnu c中,存在乙個非常奇怪的用法,那就是長度為0的陣列,比如array[0];很多人可能覺得不可思議,長度為0的陣列是沒有什麼意義的,不過在這兒,它表示的完全是另外的一層意思,這個特性是不可移植的,所以,如果你致力於編寫可移植,或者是稍稍需要跨平台的**,這些trick最好還是收起來的好。
在gnu的指南中,它是如此寫道:
struct line ;
//...ommit code here
這個用法主要用於變長buffer,struct line的大小為4,結構體中的contents[0]不占用任何空間,甚至是乙個指標的空間都不佔,contents在這兒只是表示乙個常量指標,這個特性是用編譯器來實現的,即在使用thisline->contents的時候,這個指標就是表示分配記憶體位址中的某塊buffer,比如malloc (sizeof (struct line) + this_length)返回的是0x8f00a40,thisline->contents指向的位置就是(0x8f00a40 + sizeof(struct line)),而這兒sizeof(struct line)僅僅是乙個int的四位元組。
對於這個用法,我們定義的結構體指標可以指向任意長度的記憶體buffer,這個技巧在變長buffer中使用起來相當方便。可能有朋友說,為什麼不把最後的contents直接定義為乙個指標呢?這兒的差別是這樣的,如果定義為乙個指標,它需要占用4bytes,並且在申請好記憶體後必須人為賦位址才可以。如果使用這個用法,這個常量指標不占用空間,並且無需賦值。
但是,方便並不是絕對的,在釋放分配的記憶體的時候,由於函式free會認為*thisline 只是指向乙個4位元組的指標,即只會釋放length的空間,而對於後面佔據大頭的buffer卻視而不見,這個就需要人為干預;而對於後面的宣告指標的方式,則可以直接用free(thisline->contents)的方式釋放掉分配的記憶體。
assert:除非必要,不要輕易使用這個功能,gnu c下可以編譯通過,所以你在使用vc++,那就不用嘗試了,編譯都無法通過。
陣列下標為負數
在使用陣列的時候,相信大多數人首先想到的是 陣列是從0開始的,陣列的下標必須大於或等於0 但是在處理一些數值計算的問題的時候,很可能會遇到下標為負數的問題,比如,在做9 7浮點小波變換的時候會有 x m x m m 在這種情況下,當要迴圈迭代計算的時候,就需要判斷m是否為負數,這個還是有點麻煩的。這...
c語言陣列下標為負數
c語言中陣列的下標可以是負號,在 執行前不會對陣列是否下標越界 溢位等異常進行警告或處理,因此需人為干預。測試 include include int main int argc,char ar int p int offset if argc 2 offset atoi ar 1 else off...
陣列的下標為什麼從0開始
關於陣列的下標為什麼從0開始,我想這是許多初學陣列的同學所疑惑的,在此我發表一些我的看法。首先假設我要定義乙個int a 相信大家對這個還是比較容易理解的,這個時候系統自動為a分配2個位元組的儲存空間 有的編譯器是4個 一般是兩個 a無可厚非,指的就是那兩個位元組的空間,如果要給a賦值的話,直接a ...