gpt4 book ai didi

c - 尝试解析 WAV 文件,memcpy 结果意外

转载 作者:行者123 更新时间:2023-11-30 16:10:48 25 4
gpt4 key购买 nike

假设我打开了一个小 WAV 文件并将其转储为 char 数组进行处理。

现在,我正在尝试将 fmt block ID memcpy 放入 4 字节缓冲区中。

char fmt[4];
memcpy(fmt_chunk_id, raw_file + 12, sizeof(char) * 4);

根据我对memcpy的理解,这会将偏移量12开始的4个字节复制到fmt中。然而,当我去调试程序时,我得到一些非常奇怪的输出:

enter image description here

它似乎正确地复制了 fmt 部分,但现在由于某种原因我在它后面有一堆垃圾。有趣的是,这个垃圾出现在格式之前,位于偏移字节 0 (RIFF) 和 8 (WAVE) 处。它是一个小端文件 (RIFF)。

我一生都无法弄清楚为什么我要从缓冲区的开头处的结尾获取数据,因为我只复制了4 个字节的数据(应完全适合前 4 个字符 f m t 和空格)。

这是怎么回事?输出似乎表明我在某个地方过度读取了内存 - 但如果是这种情况,我会期望垃圾而不是先前偏移量的数据。

编辑:

如果重要的话,raw_file 的数据类型是 const char* const

最佳答案

调试器正在向您显示已在堆栈上动态分配的内存区域。

很可能发生的情况是,您从文件中读取数据,即使您要求读取(例如)50 个字节,底层系统也可能决定读取更多(通常为 1024、2048 或 4096 字节) 。因此,这些字节在内存中传递,可能有一些在堆栈上,并且该堆栈现在被您的函数重用。如果您要求读取超过这四个字节,那么这种情况更有可能发生。

然后调试器发现您指向一个字符串,但在 C 中字符串会一直运行,直到它们以零 (ASCIIZ) 终止。因此,您看到的是前四个字节以及后面的所有其他内容,直到第一个 0x00 字节

如果这对你很重要,那就

char fmt[5];
fmt[4] = 0;
// read four bytes into fmt.

现在调试器将只显示前四个字节。

但是现在您明白为什么在释放()内存区域之前总是应该清除并覆盖敏感信息 - 数据可能保留在那里,甚至被意外重用或转储。

关于c - 尝试解析 WAV 文件,memcpy 结果意外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58793672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com