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