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

问题描述 投票:-5回答:1

我到处寻找,试着弄清楚如何修复SIGSEGV并且只看到它是由于悬挂指针或没有分配足够的内存。我认为这会导致错误,因为与malloc函数有关,我仍然不太清楚。

目前我已经尝试用更大或更大的数字填充malloc函数,并且对结构数组进行相同的处理,并在编译时不断得到SIGSEGV错误,所以如果愿意的话,将999999作为填充程序处理。

我对代码的理解是,在打开二进制文件后的main函数中,它将单独读取,每个struct成员都被创建为一个名为“arr”的struct数组。然后使用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);
c struct binary malloc sigsegv
1个回答
0
投票

一些问题

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

Allocating structs in the stack

这将为struct variables分配一个999999指针数组。

struct variables *arr[999999];

你可能想要的是一系列struct variables

struct variables arr[999999];

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

Allocating structs in the heap

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.