2017-08-15 73 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