Как исправить SIGSEGV в C в этой ситуации? - PullRequest
0 голосов
/ 08 сентября 2018

Я искал повсюду, чтобы попытаться выяснить, как исправить 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);

1 Ответ

0 голосов
/ 08 сентября 2018

Несколько вопросов

  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).

...