SIGSEV при попытке доступа к динамическому массиву указателей (C) - PullRequest
0 голосов
/ 21 января 2019

Я получаю сообщение об ошибке, когда scanf пытается получить доступ к titolo [i] -> nome, и я не понимаю, почему

typedef struct tit *TITOLO;

struct tit {
    char nome[20];
};

int main()
{
    TITOLO *titolo;
    titolo =(TITOLO *) malloc(4*sizeof (TITOLO));
    if (titolo == NULL) exit(1);
    int i;
    for (i=0;i<4;i++) {
        printf("Insert title: ");
        scanf("%s", titolo[i]->nome);
    }
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вы, вероятно, хотите это:

typedef struct tit *TITOLO;

struct tit {
  char nome[20];
};

int main()
{
  TITOLO titolo;
  titolo = (TITOLO)malloc(4 * sizeof(struct tit));
  if (titolo == NULL) exit(1);
  int i;
  for (i = 0; i < 4; i++) {
    printf("Insert title: ");
    scanf("%s", titolo[i].nome);
  }
  return 0;
}

TITOLO уже указатель типа.

Но лучше всего сделать так, как предложено ответом Лундина и комментарием с множеством голосов:не скрывайте указатели типов за typedefs, это только добавляет путаницу.

BTW:

... = (TITOLO)malloc(...

можно записать как:

... = malloc(...

приведениесовсем не обязательно.

0 голосов
/ 21 января 2019

typedef struct tit *TITOLO; определяет TITOLO как тип указателя, а не тип структуры. Избавьтесь от этого и введите вместо этого определение структуры:

typedef struct {
    char nome[20];
} TITOLO;

TITOLO* titolo = malloc(4*sizeof(*titolo));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...