我到处环顾四周,尝试找出如何解决SIGSEGV的问题,但仅看到这是由于指针悬空或未分配足够的内存而引起的。我认为由于与malloc函数有关的原因,这始终会产生错误,而我仍然不太了解。

目前,我尝试用更大或更大的数字填充malloc函数,并使用结构数组填充该函数,并在编译时不断收到SIGSEGV错误,因此,如果愿意,可以将999999用作填充符。

我对代码的理解是,在打开二进制文件后,在main函数中,它将单独读取每个结构成员到已创建的称为“ 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);

最佳答案

一些问题


您是先在堆中分配东西,然后在堆栈中分配东西?
您正在为pointers to struct variables分配空间,而不是为struct variables分配空间。
为什么999999


在堆栈中分配结构

这将分配999999个指向struct variables的指针的数组。

struct variables *arr[999999];


您可能想要的是一个struct variables数组

struct variables arr[999999];


指针占用8个字节(在最常见的体系结构中)。

在堆中分配结构

或者,您可以在堆中分配内容

struct variables *arr = (struct variables *) malloc(999999);


如果您希望在退出该功能后可以使用该内存,这将很有用;或要调整大小(请参见realloc)。缺点是您现在有责任在不再需要它时将其释放(请参见free)。

关于c - 在这种情况下,如何在C中修复SIGSEGV?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52234169/

10-11 19:42