使用 C 解析 MIDI 文件 - (内存分配可能出现的问题)

Parsing MIDI Files using C - (Possible Problem Allocating Memory)

我一直在尝试使用 C 编写 MIDI 解析器。
我进行了研究,并从多个来源了解了很多关于 MIDI 文件结构的信息。
这里有一些最重要的有用的(对于感兴趣的):

使用上述来源的信息,我编写了一个真正未优化的 MIDI 解析器。当前版本的目的是简单地打印它遇到的事件并将它们保存在文件中。
我已经设法解析了 midi 文件[尽管我遇到了一个不应该存在的元事件(元事件 0x09 )].


然而,在实现保存功能时,我发现如果我尝试保存某些 midi 文件会导致问题(只需解析它们就可以正常工作)(程序冻结了一段时间并且 returns 非- 完成执行前的零值)。
我认为问题可能与我分配内存或访问内存的方式有关。
这是代码(正如我所说,它还不漂亮):

_MtrkCD **MtrkDatas = (_MtrkCD **)(malloc(sizeof(_MtrkCD *)));
uint64_t i,j,k,p;
for (p=0;p<MthdData->tracks_count;p++){
    MtrkDatas[p] = (_MtrkCD *)(malloc(sizeof(_MtrkCD)));
    if(!_ReadMtrkChunk(midiFile,MtrkDatas[p],p,print)){
        printf("Error reading MTrk Chunk. Bad MTrk.\n");
        return 0;
    }
}

^the part that allocates memory (posted because it's required)^

main.c
这是我使用的两个示例文件(一个工作正常,另一个导致问题):
home.mid(This file doesn't cause problems)
014-Theme03.mid(This is the one causing problems)
这是我 运行 程序时的输出:
home Parsed.txt(Expected Output)
014-Theme03 Parsed.txt(What even is this?)
再次,我想指出一些我注意到的事情:

  1. 程序解析两个 MIDI 文件没有任何问题
  2. 该程序不仅无法将事件输出写入 .txt 文件,而且无法写入正确的字节数

谢谢大家的宝贵时间。 (另外,如果有人能更好地格式化文本,我将不胜感激。如您所见,我不是很擅长。)

更新:

这是工作代码。我犯了一个非常简单的错误,为曲目分配内存。感谢Paul R指出错误

_MtrkCD **MtrkDatas = (malloc(sizeof(_MtrkCD *) * (MthdData->tracks_count)));
uint64_t i,j,k,p;
for (p=0;p<MthdData->tracks_count;p++){
    MtrkDatas[p] = (malloc(sizeof(_MtrkCD)));
    if(!_ReadMtrkChunk(midiFile,MtrkDatas[p],p,print)){
        printf("Error reading MTrk Chunk. Bad MTrk.\n");
        return 0;
    }
}

这一行:

_MtrkCD **MtrkDatas = (_MtrkCD **)(malloc(sizeof(_MtrkCD *)));

你只分配了一个数组一个指针。所以这里你有未定义的行为:

MtrkDatas[p] = (_MtrkCD *)(malloc(sizeof(_MtrkCD)));

每当 p > 0(即如果 tracks_count > 1 那么你就有麻烦了)。

您可能应该更改:

_MtrkCD **MtrkDatas = (_MtrkCD **)(malloc(sizeof(_MtrkCD *)));

至:

_MtrkCD **MtrkDatas = malloc(MthdData->tracks_count * sizeof(_MtrkCD *));

(注意演员表已被删除,因为它是 redundant and potentially dangerous to cast the result of malloc and friends in C)。