0

配列が最大容量に達したら、配列のサイズを変更したいと思います。しかし、./a.outを実行した後にエラーが発生しました助けてください...

Error: a.out: malloc.c:3574: mremap_chunk: Assertion `((size + offset) & (mp_.pagesize-1)) == 0' failed.

コード:

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


int main(void)
{
  int cap=5;
  int *arr = malloc(cap*sizeof(int));
  FILE *f;

  if((f=fopen("/home/file.txt","r"))==NULL)
    printf("You cannot open");  

  while(fscanf(f, "%d", arr++)!=EOF)
  {
    index++;
    if(index==cap-1)
      arr = realloc(arr, (cap +=1) * sizeof(int));
  } 

  return 0;
}
4

2 に答える 2

5

あなたはarr++あなたのループ状態にあります。つまりarr、 を呼び出したときに、割り当てられたメモリの先頭を指しなくなりますrealloc()。それはあなたが見ているエラーで終わるでしょう。

また:

  1. プログラミングの安全上の注意:

    realloc()次の形式で呼び出さないでください。

    foo = realloc(foo, bar);
    

    エラーが発生した場合、fooが設定されNULL、元の割り当てがリークされます。

  2. 非慣用的なコード ノート:

    (cap +=1) * sizeof(int)
    

    は少し奇妙です。なぜ++cap * sizeof(int)ですか?または、すべてを 1 行に詰め込むのではなく、2 行で行うことをお勧めします。

于 2012-04-07T18:13:01.173 に答える
0

reallocfromm から受信した同じアドレスでを実行する必要がありmallocますがarrwhile(fscanf(f, "%d", arr++)!=EOF)

于 2012-04-07T18:13:31.103 に答える