我到处寻找,试着弄清楚如何修复SIGSEGV并且只看到它是由于悬挂指针或没有分配足够的内存。我认为这会导致错误,因为与malloc函数有关,我仍然不太清楚。
目前我已经尝试用更大或更大的数字填充malloc函数,并且对结构数组进行相同的处理,并在编译时不断得到SIGSEGV错误,所以如果愿意的话,将999999作为填充程序处理。
我对代码的理解是,在打开二进制文件后的main函数中,它将单独读取,每个struct成员都被创建为一个名为“arr”的struct数组。然后使用qsort函数对这个结构数组进行排序。然后f指针将回退到第一个内存块,然后将排序后的结构数组写出到二进制文件中,最后释放内存。我完全接近我想要实现的目标吗?
while(!feof(f)){
struct variables *arr[999999]; //create array of structs??
*arr = malloc(999999); //allocate required memory to the array of structs??
fread(&arr, sizeof(c.monkey), 1, f);
fread(&arr, sizeof(c.apple), 1, f);
fread(&arr, sizeof(c.shield), 1, f);
fread(&arr, sizeof(c.car), 1, f);
fread(&arr, sizeof(c.house), 1, f);
fread(&arr, sizeof(c.pool), 1, f);
fread(&arr, sizeof(c.person), 1, f);
fread(&arr, sizeof(c.spade), 1, f);
fread(&arr, sizeof(c.traffic), 1, f);
fread(&arr, sizeof(c.egg), 1, f);
fread(&arr, sizeof(c.envelope), 1, f);
fread(&arr, sizeof(c.hair), 1, f);
fread(&arr, sizeof(c.speaker), 1, f);
fread(&arr, sizeof(c.sword), 1, f);
fread(&arr, sizeof(c.tower), 1, f);
fread(&arr, sizeof(c.phone), 1, f);
qsort(&arr, 16, sizeof(c), compare);
rewind(f);
fwrite(arr, sizeof(c.monkey), 1, f);
fwrite(arr, sizeof(c.apple), 1, f);
fwrite(arr, sizeof(c.shield), 1, f);
fwrite(arr, sizeof(c.car), 1, f);
fwrite(arr, sizeof(c.house), 1, f);
fwrite(arr, sizeof(c.pool), 1, f);
fwrite(arr, sizeof(c.person), 1, f);
fwrite(arr, sizeof(c.spade), 1, f);
fwrite(arr, sizeof(c.traffic), 1, f);
fwrite(arr, sizeof(c.egg), 1, f);
fwrite(arr, sizeof(c.envelope), 1, f);
fwrite(arr, sizeof(c.hair), 1, f);
fwrite(arr, sizeof(c.speaker), 1, f);
fwrite(arr, sizeof(c.sword), 1, f);
fwrite(arr, sizeof(c.tower), 1, f);
fwrite(arr, sizeof(c.phone), 1, f);
free(*arr);
一些问题
pointers to struct variables
而不是空间为struct variables
分配空间。999999
?这将为struct variables
分配一个999999指针数组。
struct variables *arr[999999];
你可能想要的是一系列struct variables
struct variables arr[999999];
指针占用8个字节(在最常见的架构中)。
或者,您可以在堆中分配内容
struct variables *arr = (struct variables *) malloc(999999);
如果您希望在离开函数后内存可用,这将非常有用;或者要调整大小(参见realloc
)。缺点是你现在有责任在你不再需要它时释放它(参见free
)。