【问题标题】:How to fix SIGSEGV in C in this situation?在这种情况下如何在 C 中修复 SIGSEGV?
【发布时间】: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


【解决方案1】:

几个问题

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

在栈中分配结构

这将分配一个包含 999999 个指针的数组,指向 struct variables

struct variables *arr[999999];

你可能想要的是struct variables的数组

struct variables arr[999999];

一个指针占用 8 个字节(在最常见的架构中)。

在堆中分配结构

或者你可以在堆中分配东西

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

如果您希望在离开函数后内存可用,这很有用;或调整大小(请参阅realloc)。缺点是你现在有责任在不再需要它时释放它(参见free)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    相关资源
    最近更新 更多