2015-06-22 123 views
0

我想分配一個數組大小64字節,然後遍歷數組索引從輸入文件中讀取每個字節。但是當我沒有malloc()數組索引時,循環停留在index0中(所以每次它循環時,它都會用下一個字節替換index0中的內容,而不是將每個字節放在下一個數組索引中,並將它們全部按時間順序排列) 。無限循環fread

當我使用malloc()它正確使用數組索引,但它是一個無限循環,並使用RAM的演出。

這裏是我的代碼:

struct BitIO { 
     FILE  *FilePointer; 
     uint8_t  *Buffer[64]; 
     uint64_t BitsAvailable; 
     uint64_t BitsUnavailable; 
} BitIO; 


void Init_BitIO(const char *FileName, const char *Mode) { 
    BitIO.FilePointer = fopen(FileName, Mode); 
    malloc(sizeof(BitIO)); 
    while (!feof(BitIO.FilePointer)) { 
     size_t BytesRead = 0; 
     for (int i = 0; i < 64; i++) { 
      BitIO.Buffer[i] = (uint8_t*)malloc(1); 
      BytesRead = fread(BitIO.Buffer[i], 1, 1, BitIO.FilePointer); 
     } 
    } 
} 
+4

'的malloc(的sizeof(BitIO));'...這是一個創造性的方式來泄漏內存! – Sebivor

+0

每次檢查內存分配或打開文件成功! – alifirat

回答

3

如果你正在 「試圖分配一個數組的大小爲64字節」,你可以考慮

uint8_t  Buffer[64]; 

,而不是

uint8_t  *Buffer[64]; 

(後者是64數組指針到字節)

這樣做後,你將不需要在malloc中作爲你的s用一個64字節的數組結構靜態分配。 '主' 循環會看起來像

for (int i = 0; i < 64; i++) { 
    BytesRead += fread(&BitIO.Buffer[i], 1, 1,BitIO.FilePointer); 
} 

但是,當然,我會建議一個更有效的形式:

BytesRead = fread(BitIO.Buffer, 1, 64, BitIO.FilePointer); 
0
  • 1點

    你需要收集的malloc()返回值到一些變量(和檢查malloc()成功使用返回的指針之前)使用分配的內存。然後,看到你的用法,我相信你會對struct成員變量類型感到困惑。根據您的使用情況,您不需要uint8_t *Buffer[64];作爲結構成員。

    1.1。如果要使用動態內存,那麼,結構成員改變,因爲

    uint8_t *Buffer; 
    

    和內部for環你做

    BitIO.Buffer[i] = malloc(sizeof(uint8_t)); //allocate memory 
    BytesRead = fread(BitIO.Buffer[i], 1, 1,BitIO.FilePointer); 
    

    ,或者更好,因爲你的循環固定數量的時間,就可以得到存儲在一個時間分配的for循環外

    BitIO.Buffer = malloc(64 * sizeof(uint8_t)); 
    

    和然後循環一次讀取一個元素。

    1.2。否則,結構成員改變,因爲

    uint8_t Buffer[64]; 
    

    ,並完全擺脫了malloc()的。

  • 點2:

    Why is 「while (!feof (file))」 always wrong?

  • 3點:

    see why not to castmalloc()和家人在C返回值。

+0

我真的不知道爲什麼我認爲malloc會自動將返回的內存放在應該在的位置,這真是一個很好的觀點。 – MarcusJ

+0

好的,請隨意downvote的任何意見,請? –