Почему мой код C выдает ошибку «ошибка сегментации», когда я пытаюсь прочитать динамически размещенное содержимое массива? - PullRequest
0 голосов
/ 01 апреля 2019

Как объясняет вопрос, я создаю динамически распределенный массив структур (как я назвал struct Desk *) в моем C-коде. В основной функции я даю номера int id в полях «int deskId». Когда я пытаюсь прочитать их идентификаторы внутри функции main, код работает, как и ожидалось. С другой стороны, если я пытаюсь прочитать их идентификаторы за пределами основного (как в коде ниже), это дает ошибку сегментации (ядро сбрасывается). Я даю проблемный код ниже. Как вы видите, я обратил внимание на адрес параметра массива (т.е. указатель на фактический массив), чтобы я мог прочитать фактическое содержимое массива, а не локальную копию. Заранее спасибо.

#include <stdio.h>
#include <stdlib.h>
#include "queue.h"

struct Desk {
    int deskId;
    Queue deskQueue;
};

struct TaxPayer {
    int id;             // tax payer ID
    float duration;     // payment duration
};

//function to display the ids of the desks
int display (int desks, struct Desk** argsptr) {
    int i=0;
    while(i < desks) {
       printf ("My argument's id is %d\n",argsptr[i]->deskId );
       i++;
    }
    return 0;
}

int main (int argc, char *argv[]) {
  int option_index = 0;
    int p_num = 20;
    int desk_num = 4;
    int max_q_size = 3;


 //initialize array of desks
  struct Desk* desk_array = malloc(desk_num * sizeof(struct Desk));
  for (int i= 0; i < desk_num; i++) {
    queueInit(&desk_array[i].deskQueue, sizeof(struct TaxPayer));
    desk_array[i].deskId = i;
  }

  display(desk_num, &desk_array);
  free(desk_array);

  return 0;
}

Ответы [ 2 ]

2 голосов
/ 01 апреля 2019

Вы передаете адрес указателя desk_array вместо display(), а не сам указатель.display() затем читает указатель, затем область памяти после указателя и т. Д. То, что вы хотите сделать, это передать указатель desk_array, а затем использовать . вместо -> внутри функции, потому что [i] разыменования desk_array.

int display (int desks, struct Desk* argsptr) {
    int i=0;
    while(i < desks) {
       printf ("My argument's id is %d\n",argsptr[i].deskId );
       i++;
    }
    return 0;
}

...

display(desk_num, desk_array);
1 голос
/ 01 апреля 2019

argsptr[i]->deskId обращается к массиву struct Desk *, но есть только один. Вам нужно (*argsptr)[i].deskId.

В качестве альтернативы, передайте desk_array вместо &desk_array, измените тип параметра на struct Desk * и используйте argsptr[i].deskId.

...