-1

I am using realloc to allocated memory at runtime in dynamic array. Firstly, I allocated a memory with calloc with sizeof a random integer a. In my program, I have taken a=2. After that I want to store some 14 random values generated, so I have to resize the memory using realloc. I am doing the same in a for loop. FOr 1 iteration, realloc works but after that size doesnt increase and a error occurs "corruption in heap". I am not able to understand the problem. Pls help me if you can, in understanding where the problem is occuring and how to solve it. Thanks a lot. Below is my code:

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;
}
4

2 に答える 2

1
  • 初期の配列の長さ (長さとサイズは同じではありません) はbであり、 ではありませんa
  • b要素を追加しますか?あなたはそうではないと思います。
  • C では、配列は 0 から始まります。ループする必要がありますfor(count=0; count<b ; count++)
  • countループ変数のひどい名前です。countループ変数ではなく、要素数を保持する必要があります。
  • j何ができるか想像するのは難しいです。呼び出しで要素サイズとして使用するためcalloc、少なくとも int のサイズである 4 の倍数である必要があります。それは何ですか?!
  • 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. エラーチェックなし。実稼働コードでは、割り当てが成功したことを確認します。この方法で行われた再割り当ては、失敗するとリークします。しかし、まだこのレベルの理解がある場合は、メッセージとエラー チェックを混同しても意味がありません。
  2. 読み取り入力はありません - あなたはそれを行うことができます。
  3. 書き込み出力はありません - あなたはそれを行うことができます。
于 2011-03-13T08:00:39.650 に答える
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);
}
于 2011-03-13T08:00:22.120 に答える