int * array = malloc(sizeof(int)arraysize); int temp = malloc(sizeof(int)* arraysize);
一般に、メモリを割り当てるときは常に、割り当てが成功したことを確認してください。
int *array = NULL, *temp = NULL;
if (NULL == (array = malloc(sizeof(int)*arraysize)))
{
fprintf(stderr, "Out of memory allocating %d bytes\n", sizeof(int)*arraysize);
abort();
}
if (NULL == (temp = malloc(sizeof(int)*arraysize)))
{
fprintf(stderr, "Out of memory allocating %d bytes\n", sizeof(int)*arraysize);
abort();
}
次に、整数のファイルを使用して、ディスク上にマージソートを実装する可能性があります(ファイルをmmap()することもできます)。
しかし、ヒープに300000個の整数(最大で4.8メガバイト、64ビット整数を使用)を割り当てると、割り当てエラーが発生する可能性があるので、これはマージソートの実装にあると思います。再帰的な実装に関係しているのかもしれません。
完全なデバッグ情報を使用してプログラムをコンパイルし、でコアダンプを確認することから始めgdb
ます。
「単純な」malloc問題
数値を表すASCII文字列の非常に大きな配列を処理する必要があるため、最初に整数のファイルに変換することから始めることができます。
FILE *fi, *fo, *ft;
char buffer[20];
int array[4096], b = 0;
fi = fopen("DATASET.dat", "r");
if (NULL == fi)
{
fprintf(stderr, "Cannot open input file\n");
abort();
}
fo = fopen("INTEGER.dat", "w");
if (NULL == fo)
{
fprintf(stderr, "Cannot open output file\n");
abort();
}
ft = fopen("TEMP.dat", "w");
if (NULL == ft)
{
fprintf(stderr, "Cannot open output file\n");
abort();
}
for(i=0; i<arraysize; i++){
fgets(buffer, 20, fi);
array[b++] = atoi(buffer);
if (4096 == b)
{
if (b != fwrite(buffer, sizeof(int), b, fo))
{
fprintf(stderr, "write error\n");
abort();
}
if (b != fwrite(buffer, sizeof(int), b, ft))
{
fprintf(stderr, "write error\n");
abort();
}
b = 0;
}
}
if (b)
{
if (b != fwrite(buffer, sizeof(int), b, fo))
{
fprintf(stderr, "write error\n");
abort();
}
if (b != fwrite(buffer, sizeof(int), b, ft))
{
fprintf(stderr, "write error\n");
abort();
}
}
fclose(fi); fi = NULL;
fclose(fo); fo = NULL;
fclose(ft); ft = NULL;
これINTEGER.dat
で、固定サイズの整数で作成されたファイルができました。これは、すべての目的と目的において、メモリ内の配列のファイルコピーです。一時配列についても同じことが言えます。
そして、そのファイルをメモリ内の配列であるかのように扱うようにシステムに指示できます。
int *sort = NULL;
int *temp = NULL;
// Temp is not shown -- identical treatment as sort
fd = open ("INTEGERS.dat", O_RDWR);
if (fd == -1)
{
fprintf(stderr, "cannot reopen output\n");
abort();
}
if (MAP_FAILED == (sort = mmap (0, arraysize*sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)))
{
fprintf(stderr, "mmap error\n");
abort();
}
if (-1 == close (fd))
{
fprintf(stderr, "error closing output file\n");
return 1;
}
do_sort(sort, temp, arraysize);
if (-1 == munmap (sort, arraysize*sizeof(int)))
{
fprintf(stderr, "error releasing mmap for %s\n", "sort");
abort();
}