Ошибка сегментации в программе C при запуске

Я пробовал malloc , и не malloc и он будет строить, но не запускаться и не компилироваться. Когда я запускаю код на codepad.org он дает мне ошибку сегментации. У меня есть массив структур, которые я вводил, и я просматриваю их для определенного элемента. Это до тех пор, пока я не получил компиляцию. Код выглядит следующим образом (я использовал netbeans, кодовые блоки и визуальные базовые программы 2012 года):

 #include  #include  #include  #define SIZE 20 #define BLOODTYPESIZE 4 #define MAX 120000 typedef struct { int month; int day; int year; } dateT; typedef struct { int hour; int minute; } timeT; typedef struct { char name[SIZE]; char organname[SIZE]; char bloodtype[BLOODTYPESIZE]; dateT dateAdded; timeT timeAdded; int received; } organT; int main(void) { int i, n, k, j; int c; int *ptr; char organ[SIZE]; char bloodkind[BLOODTYPESIZE]; organT patient[MAX]; scanf("%d",&n); ptr = (int *)malloc(n * sizeof(*ptr)); printf("Enter patient information\n"); for(i=1; i<=n; i++){ scanf("%s", patient[i].name[SIZE]); scanf("%s", patient[i].organname[SIZE]); scanf("%s", patient[i].bloodtype[BLOODTYPESIZE]); scanf("%d %d %d", patient[i].dateAdded); scanf("%d %d", patient[i].timeAdded); patient[i].received = 0; } scanf("%d", &k); for(j=0; j<k; j++) { gets(organ); printf("Organ received: %s", organ); gets(bloodkind); printf("Organ has blood type: %s", bloodkind); } for (c=0; c<n; c++){ if(patient[i].organname == organ){ if(patient[i].bloodtype == bloodkind){ if(patient[i].received == 0) { printf("Patient(s) Found!\n"); printf("%s", patient[i].name[SIZE]); printf("Organ received: %s", organ); patient[i].received = 1; } if(patient[i].received == 1) printf("Patient already received organ\n"); } else("Not correct blood type\n"); } else("No match found\n"); } return (EXIT_SUCCESS); } 

Похоже, что вы неправильно используете адрес. Например, когда вы говорите

 scanf("%s", &patient[i].name[SIZE]); 

вы фактически просматриваете выделенное пространство для patient[i].name . Вы должны изменить заявление на

 scanf("%s",patient[i].name); 

и фиксировать другие утверждения аналогичным образом.

  • Сначала проверьте n по сравнению с MAX
  • здесь вы bloodtype[BLOODTYPESIZE] доступ к bloodtype[BLOODTYPESIZE] но последним пунктом на этой вкладке является bloodtype[BLOODTYPESIZE-1]

      scanf("%s", &patient[i].bloodtype[BLOODTYPESIZE]); 

Та же проблема есть и для других аксессуаров в параграфе.