努力了解如何使用malloc()正确分配内存

时间:2017-08-17 08:42:15

标签: 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,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)取消分配内存?

2 个答案:

答案 0 :(得分:3)

您正在从temp_arrindex[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_arrindex[j]填充index[j+1](可能是1319 ),您正在从索引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进行检查)。