【问题标题】:Debug Assertion Failed Buffer != NULL [closed]调试断言失败缓冲区!= NULL [关闭]
【发布时间】:2014-10-07 16:00:41
【问题描述】:

你好,我有一个大学项目可以用任何语言读取 Wav 文件,所以我选择了 C/C++,我想我做的一切都是对的,但我一直在做的一件事 c项目我总是得到这个消息“缓冲区!= NULL”

完整代码:

int main (){
    //char id[10];
    FILE *wav;
    wav=fopen("sound.wav","rb");

    if(wav){
        BYTE wav_id[5], *sound_buffer;      
        DWORD size;

        short format_tag, channels, block_align, bits_per_sample;
        DWORD format_length, sample_rate, avg_bytes_sec,datasize,i;

        fread(&wav_id,sizeof(BYTE),4,wav);
        wav_id[sizeof(BYTE)+3]=0;   

        if (!memcmp(&wav_id,"RIFF",4)) {
            fread(&size,sizeof(DWORD),1,wav);
            fread(&wav_id,sizeof(BYTE),4,wav); 
            if (!memcmp(&wav_id,"WAVE",4)) { //this is probably a wave file since it contained "WAVE" 

                fread(&wav_id,sizeof(BYTE),4,wav); //read in 4 bytes "fmt "; 
                fread(&format_length,sizeof(DWORD),1,wav);
                fread(&format_tag, sizeof(short), 1, wav); 
                fread(&channels, sizeof(short),1,wav); 
                fread(&sample_rate, sizeof(DWORD), 1, wav); 
                fread(&avg_bytes_sec, sizeof(short), 1, wav); 
                fread(&block_align, sizeof(short), 1, wav); 
                fread(&bits_per_sample, sizeof(short), 1, wav); 
                fread(&wav_id, sizeof(BYTE), 4, wav); //read in 'data' 
                fread(&datasize, sizeof(DWORD), 1, wav); //how many bytes of sound data we 
                sound_buffer=(BYTE *)malloc(sizeof(BYTE) * datasize);
                fread(sound_buffer, sizeof(BYTE), datasize, wav);  // i trace the problem to this line the whole above code seems to run smooth 
            }
            cout << "\n The file is Riff but it's not a wav file"<<endl;
        }
        else {
            cout <<"\nNOT a Wav File\n"<<endl;}

        }
    else {
        cout <<"\nFile wasn't opened\n"<<endl;
    }

    system("pause");
}

【问题讨论】:

  • 你应该再看一遍错误信息,很清楚。它还应该包含错误所在的行号,因此很容易找到。如果程序甚至没有构建,你怎么能得到一个断言错误呢?此外,断言错误和构建错误是两个不同且独立的问题,因此您可能应该有两个问题,而不是将它们混为一谈。
  • 您将不得不提供更多细节。哪些行会产生编译错误? C 和 C++ 不是同一种语言,将项目从一种语言切换到另一种语言并非易事。
  • 它说的是第 147 行,而我的代码只有 66 行,我知道问题出在哪里,但我不知道如何解决它
  • 此外,您的代码中有undefined behavior,因为wav_id 不是正确的以零结尾的字符串。这意味着strcmp 函数将超出wav_id 数组的末尾。我非常希望wav_id 是一个数组,或者在读取时将指针传递给wav_id 时,您会有更多(可能是两种情况)未定义的行为。
  • c project i always get this msg "Buffer != NULL" 你在哪个代码中遇到了这个问题!

标签: c++ c visual-studio-2013 wav


【解决方案1】:

如您的错误所示-

Error 2 error C2664: 'strcmp' : cannot convert parameter 1 from 'BYTE [5]' to 'const char *'

您不能将BYTE [5] 数据类型传递给字符串比较函数。它对原型无效。语法是-

int strcmp(const char *s1, const char *s2);

你的两个参数都必须是字符串!

但是您将wav_id 传递给strcmp。我认为这不是字符串-

strcmp(wav_id,"RIFF") // problem 
strcmp(wav_id,"WAVE") // problem

否则,您可以使用memcmp 与内存位置进行比较。原型是-

int memcmp(const void *s1, const void *s2, size_t n);

两个参数都是void *,所以你可以向这个函数传递任何类型的指针!

尝试以下更改-

if (!memcmp(&wav_id,"RIFF",4)) {
    fread(&size,sizeof(DWORD),1,wav);
    fread(&wav_id,sizeof(BYTE),4,wav); 
    if (!memcmp(&wav_id,"WAVE",4)) 
... }

【讨论】:

  • BYTE 可能是unsigned char 的类型定义,所以你可以使用memcmp 来代替。
  • 对不起先生,但我实际上知道,我需要一种方法来解决它,因为我尝试了所有的投射,应对一切,但什么也没发生
  • @BishoyM 如果你知道,你为什么要写 strcmp?
  • 因为我一遍又一遍地搜索,我找不到做同样工作的东西
  • 好吧,先生,你已经解决了我的第二个问题,我弄错了对不起
【解决方案2】:

将 WAVE 音频 ID 视为整数更容易。说uint32_t。然后你可以参考一个 ASCII 表来定义一些常量:

const uint32_t RIFF_ID = 0x46464952;

请记住,WAVE 音频是一种小端格式。

然后您可以直接读取uint32_t 变量并与== 进行简单比较。


关于另一个问题,fread 中的断言失败,很可能datasize 是一个非常大的值,对malloc 的调用失败,返回NULL。当您将NULL 作为fread 的缓冲区传递时,CRT 的调试版本会检测到该问题。添加一些错误检查。调用malloc 而不检查返回值是否有错误是错误的。

【讨论】:

  • 我不知道我会搜索它,谢谢
  • 是的,我检查了它并返回 null ,但我该如何处理呢?
  • 我猜你读错了标题。或者 WAVE 文件无效。
  • 不管怎样,谢谢,我会再从这里走我自己的
【解决方案3】:

你可以使用memcmp

但是对于 c++ 我会使用这样的

 template <char a, char b, char c, char d>
    struct  NUMBER { 
        enum {
            value = a +
            (static_cast<uint32_t> (b) << 8) +
            (static_cast<uint32_t> (c) << 16) +
            (static_cast<uint32_t> (d) << 24)        };
    };

...

        uint32_t  data;
        fread(&data,sizeof(uint32_t),1,wav)

        if ( data !=  NUMBER<'R', 'I', 'F', 'F'>::value) //  "RIFF" 
            return -1; //Not RIFF 

【讨论】:

    猜你喜欢
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 2016-08-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2013-06-06
    相关资源
    最近更新 更多