0

输入文件是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. */


    char *ptr;  
    long n = hdr.S2.Subchunk2Size;


    /// COPYING SAMPLES...
    ptr = malloc(sizeof(n));

    fread( ptr, 1, n, input );   


    int min = ptr[0], max = ptr[0], i;

    /* THE PROBLEM IS HERE: */
    for ( i = 0; i <= n; i++ )  // Finding 'max' and 'min'.
        {
            if ( ptr[i] < min )    
                min = ptr[i];
            if ( ptr[i] > max ) 
                max = ptr[i];
    }

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

    fclose(input);
    fclose(output);

    return 0;
}

为什么它的行为如此奇怪?

4

2 回答 2

6

问题出在(至少)

ptr = malloc(sizeof(n));

因为sizeof(n) 是 4,所以 sizeof(n) 等于 sizeof(long)。您刚刚为 ptr 分配了 4 个字节。

The solution of your problem is the following:

ptr = malloc(n); 
/* It will allocate the size of 'n' (27164102 bytes),
   but not the data type size (4 bytes). */
于 2013-05-09T20:05:41.297 回答
4

数组的索引从零到n-1,但在以下代码中:

for ( i = 0; i <= n; i++ )

您正在尝试从零读取到n

于 2013-05-09T20:05:09.693 回答