道歉,如果这似乎是我之前提出的问题的重新发布。我有一个数据数组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,10,13,19,24};
int h = 27;
int k;
int c;
int len;
for(j = 0;j < 4;++j)
{ printf("\n");
len = index[j+1] - index[j] - 1;
printf("len %d: ",len);
int *temp_arr = malloc(1000*sizeof(int));
for(k = index[j];k<(index[j+1]);++k )
{
printf("array val %d, ", arr[k]);
temp_arr[k] = arr[k];
}
int local_min ;
local_min = temp_arr[0];
for ( c = 1 ; c < len ; 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
正确分配内存。我一直在尝试不同的价值观;太小的值和我的程序崩溃,太大的值和我的输出的一些是不明智的。在我给出的示例中,我得到了正确值和无意义值的混合。
为每个j
值创建此动态数组是否存在问题?我是否正确使用free(temp_arr)
取消分配内存?
答案 0 :(得分:3)
您正在从temp_arr
向index[j]
填充index[j+1]
,然后您将其值从c=1
打印到c=len=index[j+1] - index[j] - 1
。
首先:您正在打印尚未初始化的值,因为您正在阅读尚未编写的地方。这是一种未定义的行为。
第二:您必须确保index[j]
,index[j+1]
和len-1
小于或等于您使用malloc分配的数组的长度。
答案 1 :(得分:1)
您在每个循环中分配1000 ints
然后释放。一次又一次。
如果你每次都想要相同的尺寸,你可以移动mallocing并释放出循环,甚至更好,使用自动数组。
int temp_arr[1000] = { 0, }; // Iam automatic array
但是如果你想让malloced数组的大小适应你在每个循环中实际需要多少int
,那么将mallocing保留在原来的地方而不是1000
,计算实际大小,这是变量len
。
int *temp_arr = malloc(len *sizeof(int));
您还必须修改此代码段,因为您正在从temp_arr
向index[j]
填充index[j+1]
(可能是13
到19
),您正在从索引0
访问它。这是未定义的行为,因为那里的值可能未初始化。
for(k = index[j];k<(index[j+1]);++k )
{
printf("array val %d, ", arr[k]);
temp_arr[k] = arr[k];
}
到
int indexCounter = 0;
for(k = index[j];k<(index[j+1]);++k )
{
printf("array val %d, ", arr[k]);
temp_arr[indexCounter++] = arr[k];
}
在进行mallocing修改后,当你的数组只有len
个边界(即大约5
)时,你可以访问边界之外,它也会导致UB。
<强> Here is live demo. 强> 通过这些修改,您的代码运行良好且更有效(使用valgrind进行检查)。