Хранение отношений в структуре C

#c

Вопрос:

Я хочу хранить отношения вещей (скажем, людей) в C. Я придумал

 #include <stdio.h>

int main(void)
{
  typedef struct rel
  {
    int person;         // person #
    int num;            // number of relationships recorded
    int relationship[]; // the person # of the person's relationships
  } rel;

  rel rels[10];
  int person = 0;
  int num;
  int i;

  // Adding persons
  for (i = 0; i < 10; i  )
  {
    rels[i].person = i;
  }

  // Adding random relationships for person #0
  for (i = 1; i < 10; i =2)
  {
    num = rels[0].num;
    rels[0].relationship[num] = i;
    rels[0].num  = 1;
  }

  // Reading all relationships of person #0
  for (i = 0; i < rels[0].num; i   )
  {
    printf("Person1 (%d) -> Person2: (%d)n", person, rels[0].relationship[i]);
  }
  return 0;
}
 

но я не уверен, что это правильный способ сделать это. Основная цель состоит в том, чтобы охватить все отношения человека.

Комментарии:

1. Этот подход неверен, потому что нет места для хранения выделенных отношений.

2. Это называется «гибким элементом массива». Для этих типов структур необходимо использовать динамическое распределение, чтобы можно было выделить место для массива.

3. @SilvioMayolo Нет, это гибкий элемент массива

Ответ №1:

Этот подход неверен, потому что нет места для хранения выделенных отношений. Вы должны выделять массивы для их динамического хранения.

Также вам необходимо инициализировать rels[0].num перед использованием его значения и добавить одно, а не два, i чтобы напечатать все отношения.

 #include <stdio.h>
#include <stdlib.h> /* for realloc() */

int main(void)
{
  typedef struct rel
  {
    int person;         // person #
    int num;            // number of relationships recorded
    /* use a pointer for dynamic array */
    int *relationship; // the person # of the person's relationships
  } rel;

  rel rels[10];
  int person = 0;
  int num;
  int i;

  // Adding persons
  for (i = 0; i < 10; i  )
  {
    rels[i].person = i;
    /* initialize members */
    rels[i].num = 0;
    rels[i].relationship = NULL;
  }

  // Adding random relationships for person #0
  for (i = 0; i < 10; i  )
  {
    /* dynamically re-allocate the array */
    int* newRelationship;
    num = rels[0].num;
    newRelationship = realloc(rels[0].relationship, sizeof(*rels[0].relationship) * (num   1));
    if (newRelationship == NULL)
    {
      perror("realloc");
      return 1;
    }
    rels[0].relationship = newRelationship;
    rels[0].relationship[num] = i;
    rels[0].num  = 1;
  }

  // Reading all relationships of person #0
  for (i = 0; i < rels[0].num; i  = 1) /* add one, not two, to print all relationships */
  {
    printf("Person1 (%d) -> Person2: (%d)n", person, rels[0].relationship[i]);
  }
  return 0;
}
 

Комментарии:

1. Хорошо, если ты так говоришь.

2. извините, что это была опечатка. Я хотел ограничить количество случайных связей (а не всех связей), но заменил i на i =2 в неправильном цикле.