2012-07-05 60 views
1
struct image_struct { 
    unsigned int width; 
    unsigned int height; 
    char mode; 
    char depth; 
    unsigned char data[13]; 
} 

image_struct* newImage(unsigned int width, unsigned int height, char depth) { 

    image_struct* image = (image_struct*)malloc(
     sizeof(image_struct) - 13 + width * height * depth); 

    return(image); 
} 

Visual Studio不會抱怨訪問13個字節以外的固定數組,這是不明智的嗎?我的目的是通過使用帶有內置標頭的結構的直接內存寫入來避免處理文件IO中的標頭。爲標題道歉。 :\使用固定陣列映射不同的內存塊結構

+0

這被稱爲[「struct hack」](http://c-faq.com/struct/structhack.html)。 – cnicutar 2012-07-05 18:38:32

回答

1

有一個技巧,你可以做的地方,你在一個結構的末尾定義一個零長度的數組。然後,您可以分配sizeof結構加上所需數組的大小,並且您可以在運行時而不是編譯時決定所需的任意大小的數組。下面是一些關於它的信息:

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

注意要點:

  1. 必須分配的內存各適量。即使您沒有分配內存,也可以在結構之外訪問內存。但這是你的代碼中的一個錯誤。內存可能用於其他事情,或者跨越邊界等。最糟糕的情況是它會覆蓋一些其他數據,直到程序的某些其他部分行爲異常時纔會發現它。切勿使用未分配的堆內存。

  2. 分配一次後,如果沒有整個結構體+數組大小,就無法重新調整數組大小。

  3. 數組必須是數組的最後一個元素

  4. 確保你知道陣列多久命中註定的。也許將結果的長度存儲在結構中的字段中,並進行自己的邊界檢查,以確保您的指針算術(/數組索引訪問)不會出錯。

這隻適用於在堆上分配的結構,而不是堆棧上的自動變量。