2015-06-22 121 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的任何意见,请? –