我有一组数据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
做了一些根本性的错误。任何有关如何正确执行此操作的建议都将非常感激。
答案 0 :(得分:3)
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]
,而index
有6
元素。
for ( c = 1 ; c < sizeof(temp_arr) / sizeof(temp_arr[0]) ; c++ ) // Where int *temp_arr
temp_arr
是指针,sizeof(pointer)
在64位上始终为8
,在32位系统上为4
。
for(k = index[j];k<(index[j+1]);++k )
{
temp_arr[k] = arr[k]; // Where int index[] = {1,5,9,13,19,24};
}
如果k
是13
或19
或24
,那么您就是界限。
你应该看看valgrind,然后逐步调试你的代码,用表达式表达。
答案 1 :(得分:1)
您似乎忘记检查Valgrind的输出,该输出显示了您使用未初始化值的确切位置以及temp_arr
的结束位置。
另请注意,temp_arr
是指针类型,sizeof temp_arr
是指针的大小,而不是它指向的数组的大小。