0

標準入力から文字配列に文字を読み取るプログラムを作成しようとしているので、その配列に対して他の操作を実行できます。必要に応じて配列に追加のメモリを動的に割り当てるプログラムを作成しました。ただし、プログラムの入力を終了すると、常にセグメンテーション違反が発生します。

ノート:

  • 読み込まれる文字を格納するために char ではなく int を使用しているので、EOF との比較は有効であると思いますか?
  • Ctrl+D を 2 回押すのにうんざりしたので、このch == 'l'行はちょうどそこにあります。この問題が解決したら削除されます。

以下はメインの内部で、プログラムの先頭に stdlib/stdio #include があります。

int arrCount = 0, arrSize = 200, ch, key_data_len;
char* input = malloc(arrSize * sizeof(char));

printf("Input is an array of %d characters that takes up %d bytes.\n", arrSize, arrSize * sizeof(char));

// Add characters to array until input is finished.
while ( (ch = (int) getchar()) != '\0' && ch != EOF) {
  if(arrCount >= arrSize)
  { 
    printf("GOT IN IF STATEMENT.");
    // If the array has not been initialized, fix that.
    if (arrSize == 0)
      arrSize = 200 * sizeof(char);

    // Make the reallocation transactional by using a temporary variable first
    char *_tmp = (char *) realloc(input, (arrSize *= 2));

    // If the reallocation didn't go so well, inform the user and bail out
    if (!_tmp)
    {
      fprintf(stderr, "ERROR: Couldn't realloc memory!\n");
      return(-1);
    }

    // Things are looking good so far
    input = _tmp;
  }

  printf("\narrCount = %d; ch = %c; sizeof(ch) = %d\n", arrCount, ch, sizeof(ch));
  input[arrCount++] = ch;

  printf("&input[%d] = %p\n", arrCount-1, &input[arrCount - 1]);
  printf("input[%d] = %c\n", arrCount - 1, input[arrCount - 1]);
  if (ch == 'l') {
    break;
  }
}

出力例:

... $ ./デシベル

入力は、200 バイトを占める 200 文字の配列です。

tl

arrCount = 0; ch = t; sizeof(チャンネル) = 4

&input[0] = 0x827a008

入力[0] = t

入力[0] = t


arrCount = 1; ch = l; sizeof(チャンネル) = 4

&input[1] = 0x827a00a

入力[1] = l

入力[1] = t

セグメンテーション違反

これに関連する可能性のある他の何か: 入力配列がインデックス 399 / サイズ 400 になるのに十分な文字を入力すると、このエラーもポップアップすることに気付きました:

*** glibc detected *** ./db: realloc(): invalid old size: 0x08a73008 ***
4

1 に答える 1

3

これは間違っています。割り当てたばかりの配列を解放しています。

input = _tmp;
free(_tmp);

はまったく必要ありませんfree-reallocそれはあなたのために行います。

于 2012-09-14T23:33:29.603 に答える