使用malloc()删除for循环中的数组的问题

时间:2017-08-15 14:41:50

标签: c arrays malloc

我有一组数据arr和一系列索引index。我的目标是使用for循环来创建在每个索引处分区的新数据数组,并进一步找到每个分区数组中的最小数据。我正在使用malloc来创建一个动态数组,然后我会在每个循环结束时释放它。

#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做了一些根本性的错误。任何有关如何正确执行此操作的建议都将非常感激。

2 个答案:

答案 0 :(得分: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位上始终为8,在32位系统上为4

  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,那么您就是界限。

  4. 你应该看看valgrind,然后逐步调试你的代码,用表达式表达。

答案 1 :(得分:1)

您似乎忘记检查Valgrind的输出,该输出显示了您使用未初始化值的确切位置以及temp_arr的结束位置。

另请注意,temp_arr是指针类型,sizeof temp_arr是指针的大小,而不是它指向的数组的大小。