2

エラーが発生する理由、realloc():次のサイズが無効ですか?

  while (loc) {
    char nextLine[MAX_PATH_LEN + 30];
    sprintf(nextLine, "<p>%s:%d</p>", loc->item.pathname,
    loc->item.offset);
    DPRINTF('h', ("Next line is: %s, length: %d\n", nextLine, strlen(nextLine))\
);

    DPRINTF('h', ("spaceUsedUp is %d\n", spaceUsedUp));
    while (spaceUsedUp + strlen(nextLine) > allocatedSize) {
      printf("Allocated size is now %d\n", allocatedSize);
      allocatedSize *= 2;
    }

    DPRINTF('h', ("Will realloc size %d\n", allocatedSize));
    char *tmp = (char *)realloc(result, allocatedSize);
    DPRINTF('h', ("Done with the realloc.\n"));
    fflush(stdout);
    if (tmp == NULL) {
      perror("realloc");
    }
    result = tmp;
    tmp = NULL;

    int theOne = (spaceUsedUp == 0) ? 0 : 1;
    memcpy(result+spaceUsedUp-theOne, nextLine, sizeof(nextLine));

    spaceUsedUp += strlen(nextLine) - theOne;
    loc = loc->nextLocation;
  }

出力は次のとおりです。

Next line is: <p>/dirA/f3:6162</p>, length: 20
spaceUsedUp is 0
Will realloc size 100
Done with the realloc.
Next line is: <p>/dirA/f3:6038</p>, length: 20
spaceUsedUp is 19
Will realloc size 100
*** glibc detected *** ./proj3/disksearch: realloc(): invalid next size: 0x0000000001797fa0 ***
4

1 に答える 1

4

これは、memcpy sizeof(nextLine)バイトを使用して、割り当てたメモリの外部を破壊しているためです。sizeof(nextLine)の代わりにstrlen(nextLine)を使用する必要があり、問題はありません。

このようなReallocエラーは、通常、メモリヒープが破損していることを示します。これは通常、範囲外の書き込みまたは解放されたポインタの再利用が原因で発生します。

Valgrindは、このような問題の友達です。

于 2012-12-07T00:22:20.797 に答える