-1

配列(グラフ)を展開し、最後に新しい値を追加するために使用される関数があります。関数への最初のリクエストは問題なく実行されますが、2 回目に実行すると問題が発生します...

コード:

struct station *addStation(struct station *graph, struct station newStation, size_t  *stationCount){
  size_t newCount = *stationCount+1;

  graph = realloc(graph, newCount*sizeof(struct station));
  *stationCount = newCount;

  graph[*stationCount] = newStation;

  return graph;
}

そしてリクエスト:

  Station *graph;
  graph = malloc(146*sizeof(Station));

  graph = loadStations(graph, &stationCount);

  Station newStation = graph[0]; // Dummyvalue

  printf("StationCount:%d\n",stationCount);

  graph = addStation(graph, newStation, &stationCount);

  printf("StationCount:%d\n",stationCount);

  graph = addStation(graph, newStation, &stationCount);

2 番目の折れ線グラフ = addStation... のため、ターミナルでメモリ出力エラーが発生します。

StationCount:146 StationCount:147 reseplanerare: malloc.c:2369: sysmalloc: アサーション `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) *) 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~(((2 * (sizeof) (size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' が失敗しました。Aborted (SIGABRT) (メモリープリント作成)

なぜこれが起こるのか理解できません...

4

1 に答える 1

3

C 配列はゼロから始まるためgraph、有効なインデックス [0..newCount-1] があります。

graph[*stationCount] = newStation;

割り当てられたメモリの末尾を超えて書き込みを行っています。これにより、未定義の動作が発生します。あなたの場合、ヒープマネージャーがこの種のメモリ破損を正確に検出するために使用するガードワードを破損していると思います。

これは、書き込む配列インデックスを変更することで修正できます。

graph[newCount-1] = newStation;
于 2013-09-30T10:45:25.697 に答える