использование указателя структуры в scanf не работает даже с синтаксисом &(struct_pointer — >struct_var)

(Был похожий вопрос, но ответ не работает)
Нет никакого предупреждения. Но после ввода значений появляется ошибка сегментации.

#include <stdio.h>

typedef struct
{
  int a;
  char b;
}PO;

PO *P[1000];

int main()
{
  scanf("%d%c",&(P[0]->a),&(P[0]->b));
}

2 ответа

  1. PO *P[1000];
    

    определяет массив из 1000 указателей на POструктуры.

    Написано так, что это, вероятно, было бы яснее:

    PO* P[1000];  // <-- P is an array of 1,000 pointers to PO
    

    То, что вы, вероятно, хотите, — это предварительно выделенный массив структур, а не указатели на них, например:

    PO Data[1000];
    

    В этом случае вы можете читать данные в него с помощью такого кода:

    scanf("%d%c", &(Data[0].a), &(Data[0].b));
    

    Или, если вы все еще хотите массив указателей, вы должны выделить каждую структуру, используяmalloc(), а затем free()после использования.

  2. Этот код должен работать:

    typedef struct
    {
     int a;
     char b;
    }PO_t;
    
    int main(void)
    {
     unsigned int i=0;
     PO_t PO[1000]; //create a 1000 struct of the type PO
     PO_t* ptr[1000]; //create 1000 pointers to struct of type PO_t
    
     for(i=0;i<1000;i++)
     {
      ptr[i]=&PO[i]; //or ptr[i]=&PO[0] if you want 1000 pointers to a single struct
     }
    
     for(i=0;i<1000;i++)
     {
          scanf("%d%c\n",&(PO[i].a),&(PO[i].b));
     }
    
     for(i=0;i<1000;i++)
     {
          printf("%d%c\n",ptr[i]->a),ptr[i]->b));
     }
    
      return 0;
    }