int* 数组 = 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();
}