結構體中最後一個成員爲char[1]或char[0]

須要引發注意的:ISO/IEC 9899-1999裏面,這麼寫是非法的,這個僅僅是GNU C的擴展,gcc能夠容許這一語法現象的存在。html

結構體最後使用0或1的長度數組的緣由,主要是爲了方便的管理內存緩衝區,若是你直接使用指針而不使用數組,那麼,你在分配內存緩衝區時,就必須分配結構體一次,而後再分配結構體內的指針一次,(而此時分配的內存已經與結構體的內存不連續了,因此要分別管理即申請和釋放)而若是使用數組,那麼只須要一次就能夠所有分配出來,(見下面的例子),反過來,釋放時也是同樣,使用數組,一次釋放,使用指針,得先釋放結構體內的指針,再釋放結構體。還不能顛倒次序。數組

其實就是分配一段連續的的內存,減小內存的碎片化。this

其實本質上涉及到的是一個C語言裏面的數組和指針的區別問題,char a[1]裏面的a和char *b的b相同嗎?char a[1]裏面的a實際是一個常量,等於&a[0]。而char *b是有一個實實在在的指針變量b存在。因此,a=b是不容許的,而b=a是容許的。兩種變量都支持下標式的訪問.spa

其實,這種語法是GCC對C語言作的擴展,官方權威說明在這裏:指針

http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Zero-Length.html#Zero-Lengthhtm

Zero-length arrays are allowed in GNU C. They are very useful as the last element of a structure which is really a header for a variable-length object: struct line { int length; char contents[0]; }; struct line *thisline = (struct line *) malloc (sizeof (struct line) + this_length); thisline->length = this_length; In ISO C90, you would have to give contents a length of 1, which means either you waste space or complicate the argument to malloc.內存

相關文章
相關標籤/搜索