Проблема 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. Но к сажалению, моего уровня знаний Си, недостаточно, да и сроки поджимают) Так что, если бы кто-лиюо смог бы мне помочь, я был бы примного благодарен.