【发布时间】:2019-02-13 11:51:10
【问题描述】:
我环顾四周,试图弄清楚如何修复 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);
【问题讨论】:
-
在 fread(&arr... 的情况下,您提供的是指针的地址。您在这里期望什么?
-
对不起,我正在更改一些参数以查看它是否可以解决我的任何问题并保持不变,但是将其保留为 (arr...) 也不能解决它。
-
您通过删除导致它的错误来修复 SIGSEGV。使用调试器。
标签: c struct binary malloc segmentation-fault