2017-08-15 63 views
0

我有一個數據數組arr和一個索引數組index。我的目標是使用for循環來創建在每個索引處分區的新數據數組,並進一步在每個分區數組中找到最小值。我使用malloc創建一個動態數組,然後在每個循環結束時釋放它。使用malloc()刪除for循環中的數組的問題

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    int j; 
    int arr[] = {1,3,4,6,7,8,12,87,89,12,34,43,54,67,81,2,0,10,23,45,81,23,89,23,56,81,28,79}; 
    int index[] = {1,5,9,13,19,24}; 
    int h = 27; 
    int k; 
    int c; 
    for(j = 0;j < h - 1;++j) 
    {   
     int *temp_arr = malloc(10*sizeof(int)); 
     for(k = index[j];k<(index[j+1]);++k) 
     { 
      temp_arr[k] = arr[k]; 
     } 
     int local_min ; 
     local_min = temp_arr[0]; 
     for (c = 1 ; c < sizeof(temp_arr)/sizeof(temp_arr[0]) ; c++) 
     { printf("Temp array %d ", temp_arr[c]); 
      if (temp_arr[c] < local_min) 
      { 
       local_min = temp_arr[c]; 
       printf("Local min in loop %d ", local_min); 
      }   
     } 
     free(temp_arr); 
     printf("\n"); 

    } 
    return 0; 
} 

不幸的是,程序崩潰時沒有給我任何錯誤信息。我認爲我可能使用malloc做了一些根本性的錯誤。任何建議如何正確地做到這一點將不勝感激。

+0

你正在分配'10'' int's。這個神奇的數字是什麼?顯然你的指數超過了'10'。 –

+0

我在這裏的想法是,我的每個臨時數組將包含少於10個整數? – Sjoseph

+1

當k = index [j]'和'j'爲'5'時,'temp_arr [k]'會是什麼? –

回答

3
  1. for(j = 0;j < h - 1;++j) // Where h = 27 
    

    這意味着j可以最大25

    for(k = index[j];k<(index[j+1]);++k) // If j = 25 
    

    你都在觸摸index[26],而index6元素。

  2. for (c = 1 ; c < sizeof(temp_arr)/sizeof(temp_arr[0]) ; c++) // Where int *temp_arr 
    

    temp_arr是指針和sizeof(pointer)是在64位總是84或32位系統。

  3. for(k = index[j];k<(index[j+1]);++k) 
    { 
        temp_arr[k] = arr[k];    // Where int index[] = {1,5,9,13,19,24}; 
    } 
    

    如果k131924你ouside界。


你應該看看valgrind,和調試代碼,一步一步,表達的表達。

1

看來你忘了檢查Valgrind的輸出,它顯示了你在哪裏使用未初始化的值,以及你跑到temp_arr的末尾。

還要注意,temp_arr是一個指針類型,而sizeof temp_arr是該指針的大小,而不是它指向的數組的大小。

+0

謝謝你清理那個!我沒有意識到這是關於temp_arr的 – Sjoseph