1

この質問は間違いなくこれに関連しおり、その答えは私が自分の機能の基にしたものです。

char *get_next_line(FILE *fp) {
char ch = 0;
int CUR_MAX = 4095;
char *buffer = (char*) malloc(sizeof(char) * CUR_MAX); // allocate buffer.
char *temp = (char*) malloc(sizeof(char) * CUR_MAX); // allocate buffer.
int count = 0;
int length = 0;

while ((ch != '\n')) {
  if (ch == '\377') { return NULL; }
  if(count ==CUR_MAX) {
    CUR_MAX *= 2;
    count = 0;
    if ((temp = realloc(buffer, CUR_MAX)) != NULL) {
      buffer = temp;
      free(temp);
    }
  }
  ch = getc(fp);
  buffer[length] = ch;
  length++;
  count++;
}

何らかの理由で、非常に大きな文字列を読み取るときに、
glibc が検出されました - realloc() の次のサイズが無効です。

私がここに欠けているものはありますか?

ありがとう!

4

3 に答える 3

4

次の場合:

free(temp);

bufferも解放されます。

buffer = temp;

したがって、後で次のことを試みています。

realloc(buffer, CUR_MAX)

bufferによって間接的に解放されたため、機能しませんtemprealloc()ポインタを解放することはできません。

于 2012-11-12T01:25:41.670 に答える
2

malloced/realloced 領域外のメモリにアクセスしていると思います。

while look 内に設定しないcount = 0と、これが修正されます。


詳しく調べてみると…

数式を開始するとき:

count = 0
length = 0
CUR_MAX = 4095

これらは 4095 に達するまで増加します。4095 に達すると、次のようになります。

count = 0
length = 4096
CUR_MAX = 8190

次に、count が 8190 になるまでインクリメントします。その少し前に、次のようになります。

count = 8100
length = 12196
CUR_MAX = 8190

配列の長さはわずか 8190 ですbuffer[12196]が、無効なインデックスである を逆参照しています。


elseまた、おそらくwhen のケースを処理したいと思うでしょうtemp == NULLassertこれはおそらく、または大きな古い障害によって処理できます。free(temp)そして、あなたの成功の側には入らないでください。これは、割り当てようとしたばかりのメモリを解放しています。そして、あなたの新しいセグメンテーション違反を引き起こしています。

于 2012-11-12T01:20:40.347 に答える
-1

realloc(buffer, CUR_MAX))void へのポインタを返します。

私は正しい声明は(char *)realloc(buffer, CUR_MAX))

于 2012-12-02T22:43:46.800 に答える