2013-11-27 85 views
2

我試圖在C中分配一個3D數組。你可以告訴它,它存儲圖像數據,格式爲Array [height] [width] [channel];這是我的代碼。使用malloc分配一個3D數組()

BYTE*** allocateImageArray(INT_32 width, INT_32 height, INT_32 channels) { 
    BYTE*** array; 
    INT_32 i, j; 

    array = malloc(height * sizeof(BYTE**)); 

    for(i = 0; i < height; i++) { 
     array[i] = malloc(width * sizeof(BYTE*)); 

     for(j = 0; j < channels; j++) { 
      array[i][j] = malloc(channels * sizeof(BYTE)); 
     } 
    } 

    printf("Pixel Array Size: %d\n", sizeof(array)); 
    return array; 
} 

它編譯得很好。但是,數組始終爲8(由sizeof指示)。當我在代碼中稍後嘗試訪問數組時,程序就會崩潰。

所有的答案在先進的感謝。

編輯:忘了包括。我已經計算出發生程序崩潰的位置。當我嘗試爲數組末尾的一個BYTES賦值時,會發生這種情況。

+0

爲什麼不'陣列= malloc的(高度*寬* *信道的sizeof(BYTE));'? –

+0

這實際上是我的原始代碼,但它也有同樣的問題。另外,它沒有定義有多少行,列和(不管第三維被稱爲)它是什麼? – user3039913

+0

這取決於你如何訪問元素。例如'array [0] [0] [0]'。 –

回答

2

sizeof運算符不會告訴你動態分配數組的大小。

sizeof返回基礎數據類型的字節大小,在您的情況下是指向指向​​的指針的指針。

由於array仍然是一個指針(不管它指向什麼),所返回的8個字節的大小是合理的。

請參考sizeof operator說明。

旁白:

我還建議在看看Why does sizeof(x++) not increment x?一個有趣的錯誤可以與sizeof運營商和假設新程序員做這件事支撐。

2

sizeof運營商不這樣工作。想象一下,如果它更像是一個特殊的#define宏,它根據其類型計算出某種東西的大小。

所以sizeof(array)sizeof(BYTE***)相同,與sizeof(void*)相同,這對於您的計算機來說顯然是8。

+0

感謝這兩個答案。說得通。任何想法爲什麼它崩潰?分配代碼是錯誤的,還是另一個可能的問題?當我嘗試將值分配給其中一個數組條目時,我發生了崩潰事件。 – user3039913

1

sizeof(array) ==指針的字節數,在你的情況下是8字節。

2

BYTE **只是一個指針,所以最後的sizeof(BYTE **)總是返回8

你可以試試下面的代碼:

#define value_at_index(a,i,j,k,m,n) (a)[(i)*m*n + (j)*n + (k)] 

static BYTE*** allocateImageArray(int width, int height, int channels) { 
    BYTE (*array)[width][height]; 

    array = malloc(width * height * channels * sizeof(BYTE)); 
    array[1][2][3] = 1; 

    printf("array[1][2][3] = %d", array[1][2][3]); 

    return (BYTE***)array; 
} 

這樣做,你有一個對於3維陣列的連續存儲器空間,然後在主()可以調用這樣的:

BYTE ***array = allocateImageArray(10, 20, 30); 
printf("array[1][2][3] = %d", value_at_index(array, 1, 2, 3, 10, 20)); 
+0

我編輯了我的答案。我試過我的舊代碼,我意識到返回一個指針是行不通的,因爲它不知道如何解釋BYTE *** array = allocateImageArray(10,20,30)的結果;''所以我爲此目的添加了#define宏。 – Krypton