应用程序崩溃虽然我无法理解原因

时间:2013-05-09 18:39:17

标签: c audio wav binaryfiles

输入文件为in.wav。我必须读取块(成功)并读取样本以规范化音频文件...

问题是它在尝试查找.wav文件样本的maxmin值时崩溃了。 它只会找到数组中的最小值和最大值,但它会崩溃... 请告诉我有什么问题。

以下是代码:

#include <stdio.h>
#include <stdlib.h>
#include "main.h"
#define hdr_SIZE 64

typedef struct FMT
{
    char        SubChunk1ID[4];
    int         SubChunk1Size;
    short int   AudioFormat;
    short int   NumChannels;
    int         SampleRate;
    int         ByteRate;
    short int   BlockAlign;
    short int   BitsPerSample;

} fmt;

typedef struct DATA
{
    char        Subchunk2ID[4];
    int         Subchunk2Size;
    int         Data[441000]; 
} data;

typedef struct HEADER
{
    char        ChunkID[4];
    int         ChunkSize;
    char        Format[4];
    fmt         S1;
    data        S2;
} header;



int main()
{
    FILE *input = fopen( "in.wav", "rb");   /// nameIn

    if(input == NULL)
    {
        printf("Unable to open wave file (input)\n");
        exit(EXIT_FAILURE);
    }

    FILE *output = fopen( "out.wav", "wb"); /// nameOut
    header hdr;


    fread(&hdr, sizeof(char), hdr_SIZE, input); 
    /* NOTE: Chunks has been copied successfully. */


    /*###############################*/                                  
    /*##### UPDATE (char *ptr;) #####*/
    /*###############################*/
    char *ptr;  // 'int' was written here instead of 'char'. That's was a stupid mistake...
    long n = hdr.S2.Subchunk2Size;


    /// COPYING SAMPLES...
    ptr = malloc(sizeof(hdr.S2.Subchunk2Size));
    while ( n-- != 0 )
    {
        fread(&ptr, 1, 1, input);  // Continues reading after the least 'stop' place. 
    }                              // I was being told here (on "stack") that it is so...


    n = hdr.S2.Subchunk2Size; // Resetting 'n'.
    int min = ptr[0], max = ptr[0], i;

    /* THE PROBLEM IS HERE: */
    for ( i = 0; i < n; i++ )
        {
            if ( ptr[i] < min )     // If the next elements is less than previous, swap them.
                min = ptr[i];
            if ( ptr[i] > max ) // If the next elements is bigger than previous, swap them.
                max = ptr[i];
    }

    printf("> > >%d__%d\n", min, max);    // Displaying of 'min' and 'max'.

    fclose(input);
    fclose(output);

    return 0;
}

更新

EUREKA!这都是因为每个样本8位!我必须和他们一起操作(带样本)和一种char。 (请参阅我的“### UPDATE ###” - 代码中的注释)

3 个答案:

答案 0 :(得分:1)

此代码:

    /// COPYING SAMPLES...
    ptr = malloc(sizeof(hdr.S2.Subchunk2Size));
    while ( n-- != 0 )
    {
        fread(&ptr, 1, 1, input);  // Continues reading after the least 'stop' place. 
    }                              // I was being told here (on "stack") that it is so...

覆盖ptr变量n次的第一个字节。这会破坏ptr的价值。即使您修改它以读取已分配的缓冲区(通过删除&),您也只会重写已分配内存的第一个字节。

你可能想要的是:

    fread(ptr, 1, n, input);

请注意,不需要while循环。但是,就我的真实意图而言,这将是我的一个猜测。

答案 1 :(得分:1)

您使用以下内容破坏了malloc() ed ptr

fread(&ptr, 1, 1, input); /* overwrite the content of ptr */

所以程序在尝试使用ptr时会崩溃。 使用:

fread(ptr, 1, 1, input);

或更好:没有while循环,并使用:

  fread(ptr, 1, n, inout);

答案 2 :(得分:1)

正如其他人指出的那样,ptr在这个区块中没有增加,

while ( n-- != 0 )
{
    fread(&ptr, 1, 1, input);  // FIXME, ptr not incremented 
}

但是你正在尝试将1字节数据存储为整数;这是你想要的吗?