程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> struct中長度為0的數組用途與原理,struct數組

struct中長度為0的數組用途與原理,struct數組

編輯:C++入門知識

struct中長度為0的數組用途與原理,struct數組


前言

    在標准C和C++中,長度為0的數組是被禁止使用的。不過在GNUC中,存在一個非常奇怪的用法,那就是長度為0的數組,比如Array[0]; 很多人可能覺得不可思議,長度為0的數組是沒有什麼意義的,不過在這兒,它表示的完全是另外的一層意思, 這個特性是不可移植的, 所以,如果你致力於編寫可移植,或者是稍稍需要跨平台的代碼,這些Trick最好還是收起來的好。

    本系列文章均系筆者所寫,難免有一些錯誤或者纰漏,如果小伙伴們有好的建議或者更好的算法,請不吝賜教。

正文

    在GNU的指南中,它是如此寫道:

復制代碼
struct line {
int length;
char contents[0];
};

//...ommit code here

{
struct line *thisline
= (struct line *) malloc (sizeof (struct line) +this_length);
thisline->length = this_length;
}
復制代碼

    這個用法主要用於變長Buffer,structline的大小為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:除非必要,不要輕易使用這個功能,GNUC下可以編譯通過,所以你在使用vc++,那就不用嘗試了,編譯都無法通過。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved