Как правильно выделить достаточно памяти (mallo c) при создании новой структуры в C? - PullRequest
0 голосов
/ 24 марта 2020

Учитывая приведенную ниже структуру, я создаю функцию, которая принимает person_in_queue и position_num и выделяет новую структуру queue_t, которая добавляется в конец списка структур queue_t, как указано первый аргумент.

typedef struct queue {
  int position_num;
  char *person_in_queue;

  struct queue *next_in_line;
} queue_t;

Я написал свой код следующим образом:

queue_t *add_to_queue(queue_t *input_queue, char *person_in_queue, int position_num) {

  input_queue = malloc(sizeof(queue_t));
  assert(input_queue != NULL);

  input_queue->position_num = position_num;
  input_queue->person_in_queue = (char *) malloc((strlen(new_text) + 1) * sizeof(char));
  assert(input_queue->person_in_queue != NULL);

  strcpy(input_queue->person_in_queue, person_in_queue);
  return input_queue;

}

Указанный код компилируется, однако мне говорят, что мой код дает сбой, поскольку выделяется меньше памяти, чем что ожидается. На данный момент я не уверен, где я иду не так здесь. Обратите внимание, что мне нужно использовать malloc()!

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 24 марта 2020

Мне сказали, что мой код не работает, учитывая, что выделено меньше памяти, чем ожидалось.

Это должно относиться к malloc((strlen(new_text) + 1) * sizeof(char)). Очевидно, new_text является глобальной строкой без видимого соединения с person_in_queue, которая должна дублироваться. Измените вызов на malloc(strlen(person_in_queue) + 1).

Как правильно выделить достаточно памяти (mallo c) при создании новой структуры в C?

Помимо выше, распределение в основном нормально, но, как отметил Марко Бонелли, вы берете input_queue в качестве аргумента и сразу же перезаписываете его ... Это не имеет особого смысла ... Было бы разумнее вернуть выделенное queue_t объект, если input_queue изначально NULL, в противном случае переданный input_queue не изменяется. Это может быть достигнуто путем изменения первых двух операторов тела вашей функции на

    queue_t *head_queue = input_queue, **pr = &input_queue;
    while (*pr) pr = &(*pr)->next_in_line;  // find end of list
    *pr =   // link new struct to list
    input_queue = malloc(sizeof(queue_t));
    assert(input_queue != NULL);
    input_queue->next_in_line = NULL;       // don't forget to initialize!

и оператора возврата на

    return head_queue ? head_queue : input_queue;

- первый также правильно устанавливает указатели ссылок next_in_line .

0 голосов
/ 24 марта 2020

sizeof является оператором в C, не является функцией, но скобки необходимы для оценки типов.

Чтобы выделить память для структуры, используйте размер типа.

input_queue = malloc(sizeof (queue_t));

Или используйте разыменованный указатель или размер объекта (здесь скобки не нужны).

input_queue = malloc(sizeof *input_queue);

...