используя realloc с циклом for - PullRequest
0 голосов
/ 13 марта 2011

Я использую realloc для выделения памяти во время выполнения в динамическом массиве. Во-первых, я выделил память с помощью calloc с размером случайного целого числа a. В моей программе я взял = 2. После этого я хочу сохранить около 14 сгенерированных случайных значений, поэтому мне нужно изменить размер памяти с помощью realloc. Я делаю то же самое в цикле. Для 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 ]

1 голос
/ 13 марта 2011
  • Начальная длина массива (длина и размер не совпадают) составляет b, а не a.
  • Добавление b элементов? Я не думаю, что вы.
  • Массивы начинаются с нуля в C. Цикл должен быть for(count=0; count<b ; count++).
  • count - ужасное имя для переменной цикла. count должен содержать количество элементов и не быть переменной цикла.
  • Трудно представить, что может быть j. Поскольку вы используете его в качестве размера элемента при вызове calloc, он должен быть по крайней мере кратным 4, размер в int. Что это?!
  • Кажется, что realloc не имеет никакого отношения к calloc.

Я уверен, что есть много других проблем. Если вам нужна дополнительная помощь, потребуется четкое указание вашей цели.

EDIT

Похоже, вы хотите что-то вроде этого:

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. Нет записи - вы можете сделать это.
0 голосов
/ 13 марта 2011

Целое число "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);
}
...