Проблема Segmentation fault в Си

Таки я делал лаб работу. Опишу её суть кратко, чтоб было понятно какие функции за чт отвечают. Есть список n людей, у каждого из людей есть Имя, Фамилия, Возраст и зп по каждому месяцу. Моя задача была в том, чтоб модифицировать код и вывести пары людей, у которых зп совпадает хотя бы в одном из 12 месяцев.

'''

#include <stdio.h>
#include <locale.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>



#define ILGIS 20
#define SCF  "%19s"

struct Person {

    char *name;
    char *surname;
    int age;
    int salaries[12];

};
//////////////////////////////////////////////////////////////////
struct Person* newPerson(){

    struct Person* p = (struct Person*) calloc(sizeof(struct Person), 1);
    p->name = (char*) calloc(sizeof(char*), (ILGIS+1));
    p->surname = (char*) calloc(sizeof(char*), (ILGIS+1));


    return p;

}

//////////////////////////////////////////////////////////////////
struct Person** newPersonsList(int num){

    struct Person** ps = (struct Person**) calloc(sizeof(struct Person*), num);
    for(int i = 0; i < num; i++){
       ps[ i ] = newPerson();
    }

    return ps;
}

//////////////////////////////////////////////////////////////////
void readPerson(struct Person* p){
    printf("name->");
    scanf(SCF, p->name);
    size_t ilg = strlen(p->name);
    if(p->name[ilg-1] == '\n')
       p->name[strlen(p->name)-1] = '\0';

    printf("surname->");
    scanf(SCF, p->surname);
    ilg = strlen(p->surname);

    if(p->surname[ilg-1] == '\n')
       p->surname[ilg-1] = '\0';

    printf("age->");
    scanf("%d", &p->age);
    for(int i=0; i < 12; i++)
    {
    printf("Atlyginimas uz %d -->",i+1);
    scanf("%d",&p->salaries[i]);
    }
}

//////////////////////////////////////////////////////////////////
void readPersonsList(struct Person **plist, int num){

   for(int i=0;i<num;i++)
      readPerson(plist[i]);

}

//////////////////////////////////////////////////////////////////

void printPerson(struct Person* p){

   printf("%s %s %d\n", p->name, p->surname, p->age);

}

//////////////////////////////////////////////////////////////////

void printPersonsList(struct Person **plist, int num){

   for(int i=0;i<num;i++){
      printf("%d: ", (i+1));
      printPerson(plist[i]);
   }

}


//////////////////////////////////////////////////////////////////

void deletePerson(struct Person* p, struct Person* age, struct Person* salaries[12])
{

    free(p->name);
    free(p->surname);
    free(age);
    for(int i=0; i<12; i++)
    free(salaries[i]);
    free(p->salaries);
    free(p);

}
//////////////////////////////////////////////////////////////////

void deletePersonsList(struct Person **plist, int num){

    for(int i=0;i<num;i++){
       free(plist[i]);
    }
    free(plist);

}

//////////////////////////////////////////////////////////////////
double personsAverage(struct Person **plist, int num){
    double vid = 0.0;

    for(int i=0;i<num;i++){
       vid += plist[i]->age;
    }

    return vid/num;
}

//////////////////////////////////////////////////////////////////
void printAboveNum(struct Person **plist, int num, double bound){

    for(int i=0;i<num;i++){
       if(plist[i]->age > bound)
          printf("%s %s\n", plist[i]->name, plist[i]->surname);
    }

}

//////////////////////////////////////////////////////////////////
void printSameNames(struct Person **plist, int num){

    for(int i=0;i<num;i++){
       for(int j=i+1;j<num;j++){
          if(strcmp(plist[i]->name, plist[j]->name) == 0)
            printf("%s: %s and %s\n", plist[i]->name, plist[j]->surname, plist[i]->surname);
       }
    }

}
void match(struct Person **plist, int num){
int k=0;
    for(int i=0;i<num;i++){
        {
            k=i;
            kitas:
            while(k<=num){
            k++;
            for(int j=0; j< 12; j++){

          if( plist[i]->salaries[j]- plist[k]->salaries[j] == 0)
            {
            printf("%s %s ir %s %s\n", plist[i]->name, plist[i]->surname,plist[k]->name, plist[k]->surname);
            if(k<num)
            goto kitas;
            }
            }
            }
    }

}
}

//////////////////////////////////////////////////////////////////
int main(){
    printf("%d\n", sizeof(struct Person));
    struct Person **list;
    int kiek;
    printf("Kiek zmoniu?\n");
    scanf("%d", &kiek);
    list = newPersonsList(kiek);

    //struct Person *salaries = (struct Person *) malloc(sizeof(struct Person)* kiek);

    readPersonsList(list, kiek);
    printf("------------------\n");

    printPersonsList(list, kiek);

    printf("------------------\n");

   double avg = personsAverage(list, kiek);
    printAboveNum(list, kiek, avg);

    printf("------------------\n");

    match(list, kiek);

    printf("------------------\n");

    printSameNames(list, kiek);
    deletePersonsList(list, kiek);

''' Как я понял, ошибка находится в функции match, т.к. она выволит первые 2 пары и дальше происходит Segmentation fault. Но к сажалению, моего уровня знаний Си, недостаточно, да и сроки поджимают) Так что, если бы кто-лиюо смог бы мне помочь, я был бы примного благодарен.


Ответы (0 шт):