Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在这种情况下,如何在C中修复SIGSEGV?_C_Struct_Binary_Malloc_Segmentation Fault - Fatal编程技术网

在这种情况下,如何在C中修复SIGSEGV?

在这种情况下,如何在C中修复SIGSEGV?,c,struct,binary,malloc,segmentation-fault,C,Struct,Binary,Malloc,Segmentation Fault,我到处寻找,试图找出如何修复SIGSEGV,但只发现这是由于指针悬空或没有分配足够的内存造成的。我认为这会不断产生错误,因为这与malloc函数有关,我仍然不能完全理解 目前,我已经尝试用更大或更大的数字填充malloc函数,同样的填充结构数组,并且在编译时不断得到SIGSEGV错误,因此如果愿意,请将999999作为填充 我对代码的理解是,在打开二进制文件后的主函数中,它将分别将每个结构成员读入一个名为“arr”的结构数组。然后将使用qsort函数对该结构数组进行排序。然后,f指针将倒带到第一

我到处寻找,试图找出如何修复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);
几个问题

  • 您首先在堆中分配内容,然后在堆栈中分配
  • 您正在为结构变量的
    指针分配空间,而不是为结构变量的
    指针分配空间
  • 为什么
    999999
  • 在堆栈中分配结构 这将为结构变量分配一个999999指针数组

    struct variables *arr[999999];
    
    您可能需要的是一个
    struct变量数组

    struct variables arr[999999];
    
    指针需要8个字节(在最常见的体系结构中)

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

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

    如果您希望在离开函数后内存可用,则此选项非常有用;或要调整大小(请参见
    realloc
    )。缺点是你现在有责任在你不再需要它的时候释放它(请参见
    免费
    )。

    在fread(&arr)的情况下,你给出了指针的地址。你在这里期望什么?对不起,我更改了一些参数,看看它是否能解决我的任何问题,并将其保持为那样,但只是将其保持为(arr…)也无法解决此问题。您可以通过删除导致SIGSEGV的错误来修复SIGSEGV。请使用调试器。