0

このコードをコンパイルして実行すると、エラーが発生します。エラーメッセージは次のとおりです。

realloc(): invalid next size: 0x0000000002119010

このファイルinputには約 4000 語があります。

デバッグしましたが、問題は見つかりません。

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

#define BUF_LEN 10   //buf length

int main(int argc, char *argv[])
{
  int file_d;                     //file descriptor
  char *ct_head;                  //content_first_char
  char *content;
  ssize_t read_len = BUF_LEN;     //had read length
  int mem_block_count = 0;

  file_d = open("input", O_RDONLY);

  if (file_d < 0)
    {
      perror("open");
      exit (1);
    }

  content = ct_head = (char *) malloc(sizeof(char) * BUF_LEN);
  mem_block_count = 1;

  while (read_len == BUF_LEN)
    {
      read_len = read(file_d, ct_head, BUF_LEN);
      if (read_len < 0)
        {
          perror("read");
          exit(2);
        }
      if (read_len == BUF_LEN)
        {
          ct_head = (char *)realloc(content, sizeof(char) *(++mem_block_count));
          ct_head = &content[(mem_block_count-1) * BUF_LEN];
        }
      else
        ct_head[read_len] = '\0';
    }
  printf("%s", content);

  close(file_d);
  free(content);
  return 0;
}
4

3 に答える 3

0

ここにはすでにいくつかの良い答えがありますが、コメントに収まらないアドバイスが少しあります。Cでは、sizeof(char)常に1です。定義上1であるため、を使用するのと同じくらい冗長(1 * BUF_LEN)です。また、Cでは、の結果をキャストする必要はありません[キャストすべきではありません] malloc。そうすることで、基本的なエラー1を隠すことができます。

タイプのサイズに応じてスペースを割り当てる場合は、次を使用します。

ct_head = malloc(sizeof(*ct_head) * BUF_LEN);

そうすれば、タイプがct_head変更された場合でも、とへのすべての呼び出しを変更しなくても、十分なスペースを割り当てることができmallocますrealloc

1.に適切なヘッダーを含めないとmalloc、Cコンパイラはがをmalloc返すと見なします。これにより、のサイズがポインタタイプのサイズと異なるintプラットフォームで問題が発生する可能性があります。intまた、整数型からポインタ型への変換は実装定義です。

于 2012-04-25T09:37:11.330 に答える
0

あなたの問題が何であるかはわかりませんが、これらの行は次のとおりです。

    ct_head = (char *)realloc(content, sizeof(char) *(++mem_block_count));
    ct_head = &content[(mem_block_count-1) * BUF_LEN];

非常に危険です。最初の行の後、ct_head再割り当てされたブロックをcontent指し、ガベージを指します。次に、2 行目で読み取りcontentと再割り当てを行い、再割り当てct_headされたメモリをリークします。

プログラムでメモリが破損していると思われますか?

おもう

ct_head = (char *)realloc(content, sizeof(char) *(++mem_block_count));

次のようにする必要があります。

content = (char *)realloc(content, sizeof(char) *(++mem_block_count) * BUF_LEN);
if (content == NULL)
{
    // do something if the realloc fails
}
于 2012-04-25T08:39:04.937 に答える
0

realloc を初めて使用するときは、呼び出しに入るsizeof(char)と 1 であり、1 であるため、2 バイトのみが割り当てられますmem_block_count(その後、事前に 2 にインクリメントされます)。

これは、次の読み取りで、割り当てられたバッファーがオーバーランすることを意味します。再割り当てでも乗算する必要があるとBUF_LEN思います。

編集

さらに悪いことに気付きました。コンテンツを 2 バイトに割り当てた直後に、コンテンツの先頭を超えるバイトに設定ct_headします。BUF_LENこれは、読み取りが完全にバッファーの外側にある領域を上書きすることを意味します。

于 2012-04-25T08:39:10.003 に答える