2013-05-09 71 views
0

输入文件是in.wav。我必须读取块(成功),并阅读示例来规范化音频文件...在查找阵列中的元素时应用程序崩溃

问题是,它试图启动maxmin值的.wav文件的示例时崩溃。 它只会找到阵列中的最小值和最大值,但是它崩溃了 ...

告诉我什么是错的,请。我没有看到这种行为的理由。

下面是代码:

#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; 
} 

为什么它的行为本身这么奇怪?

+0

编辑您的代码:为(I = 0; I mojtaba 2013-05-09 20:05:08

+0

相当好评,但它并没有帮助解决问题。 – yulian 2013-05-09 20:12:44

回答

6

问题是在(至少)

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

你正在试图从零到读

ptr = malloc(sizeof(n)); 

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

您的问题的解决方案如下:

ptr = malloc(n); 
/* It will allocate the size of 'n' (27164102 bytes), 
    but not the data type size (4 bytes). */ 
+0

你确定吗?因为'long n = hdr.S2.Subchunk2Size;' - > n = 27164102('数据'块大小)。 – yulian 2013-05-09 20:08:16

+2

是的,sizeof(n)是4.尝试'malloc(n)' – Maxim 2013-05-09 20:09:07

+0

sizeof返回它的日期类型的大小,而不是数据的大小 – Gisway 2013-05-09 20:12:21

4

阵列从零索引到n-1,但在下面的代码段:以n

+0

好的。但我没有解决主要问题。 – yulian 2013-05-09 20:10:21

+1

@Julian虽然这个问题在很多情况下会造成更少的壮观问题,但这两个问题都会让你的程序超出其分配的内存,两者都是同样错误的,都应该被解决。 – fvu 2013-05-09 20:23:37

+0

@fvu我同意你的意见。 – yulian 2013-05-09 20:35:22