使用带有for循环的realloc

时间:2011-03-13 07:41:55

标签: c memory-management realloc

我正在使用realloc在运行时在动态数组中分配内存。首先,我分配了一个带有calloc的内存,其大小为随机整数a。在我的程序中,我采取了= 2。之后我想存储大约14个随机值,所以我必须使用realloc调整内存大小。我在for循环中做同样的事情。 FOr 1迭代,realloc工作,但在该大小没有增加和错误发生“堆中的损坏”。我无法理解这个问题。如果可以的话,请帮助我,了解问题的发生位置以及如何解决问题。 非常感谢。 以下是我的代码:

j=j*a; //a=3
    numbers = (int*) calloc(b, j); //b=14, no of elements I want to store

    printf("Address:%p\n",numbers);
    if (numbers == NULL)
    {
        printf("No Memory Allocated\n");
    }
    else
    {
    printf("Initial array size: %d elements\n", a);
    printf("Adding %d elements\n", b);
    }



    srand( (unsigned) time( NULL ) );
    for(count = 1; count <= b ; count++)
    {


        if(i <= j)
        {

        numbers[count] = rand() % 100 + 1;
        printf( "Adding Value:%3d Address%p\n", numbers[count],numbers[count] );

           i++;

        }

        if (i > j)
        {
                printf("Increasing array size from %d bytes to %d bytes\n",j,j*a);
                j=j*a;  
                numbers = (int*) realloc(numbers,j);
                printf("Address:%p\n",numbers);
                if(numbers == NULL)
            {
                printf("No Memory allocated\n");
            }


        }

    }   

    free(numbers);

    return 0;
}

2 个答案:

答案 0 :(得分:1)

  • 初始数组长度(长度和大小不同)为b,而不是a
  • 添加b元素?我认为你不是。
  • 数组在C中从零开始。您的循环应为for(count=0; count<b ; count++)
  • count是循环变量的可怕名称。 count应该保留元素的数量而不是循环变量。
  • 很难想象j会是什么。由于您在调用calloc时将其用作元素大小,因此它应该至少是4的倍数,即int的大小。它是什么?!
  • realloc似乎与calloc没有任何关系。

我确定还有很多其他问题。如果您需要更多帮助,则需要明确说明您的目标。

修改

听起来你想要这样的东西:

int capacity = 10;
int count = 40;
int i;

int* array = (int*)malloc(capacity*sizeof(int));
for (i=0; i<count; i++)
{
    if (i==capacity)
    {
        capacity *= 2;
        array = (int*)realloc(array, capacity*sizeof(int));
    }
    array[i] = RandomIntInRange(1, 100);
}
free(array);

备注

  1. 没有错误检查。在生产代码中,您将检查分配是否成功,如果失败,以这种方式完成的realloc将泄漏。但是当你仍处于这种理解水平时,将错误检查信息混淆是毫无意义的。
  2. 没有阅读输入 - 你可以这样做。
  3. 没有写作输出 - 你可以这样做。

答案 1 :(得分:0)

整数“j”未在代码中初始化,导致a = 0 * 3,这意味着a将为零,并且不会分配任何内存。 segfault是由于您没有处理数字为NULL。更改为并将j设置为有意义的内容

#include <stdlib.h>
#include <stdio.h>

void
main (int argc, char *argv[])
{
  int a = 3;
  int j = 1 * a;        //a=3
  int b = 14;
  int *numbers = calloc (b, j); //b=14, no of elements I want to store
  int count = 0, i = 0;

  printf ("Address:%p\n", numbers);
  if (numbers == NULL)
    {
      printf ("No Memory Allocated\n");
      return;
    }
  else
    {
      printf ("Initial array size: %d elements\n", a);
      printf ("Adding %d elements\n", b);
    }



  srand ((unsigned) time (NULL));
  for (count = 1; count <= b; count++)
    {
      if (i <= j)
    {
      numbers[count] = rand () % 100 + 1;
      printf ("Adding Value:%3d Address%p\n", numbers[count],
          &(numbers[count]));

      i++;

    }

      if (i > j)
    {
      printf ("Increasing array size from %d bytes to %d bytes\n", j,
          j * a);
      j = j * a;
      numbers = (int *) realloc (numbers, j);
      printf ("Address:%p\n", numbers);
      if (numbers == NULL)
        {
          printf ("No Memory allocated\n");
        }


    }

    }

  free (numbers);
}