我到处四处寻找解决SIGSEGV的方法,并且只看到它是由于指针悬空或未分配足够的内存。我认为由于与我仍然不完全了解的malloc函数有关,这一直在给出错误。
当前,我尝试用更大或更大的数字填充malloc函数,并用结构数组填充它,并在编译时不断收到SIGSEGV错误,因此,如果可以的话,请将999999当作填充符。
我对代码的理解是,在打开二进制文件后的主要功能中,它将单独读取每个结构成员到已创建的称为“ arr”的结构数组中。然后将使用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);
答案 0 :(得分:0)
一些问题
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
)。