Сбой приложения с указателем, заголовочным файлом и структурным массивом - PullRequest
0 голосов
/ 02 мая 2018

Я создал проект в C с 3 файлами, main.c, где я пишу main:

main.c

#include <stdlib.h>
#include <stdio.h>

typedef struct{
    char nome[29];
    char cognome[28];
    int et;
}s_persona;

int main(){
    s_persona personaX[5];

    caricamento(&personaX[5]);

    int i;

    for(i=0;i<=5;i++){
        printf("Nome: %s\t Cognome: %s\t Eta': %d\n", personaX[i].nome, personaX[i].cognome, personaX[i].et);
    }

    system("pause");
}

затем заголовочный файл с прототипом (struct.h):

#ifndef STRUCT_H_
#define STRUCT_H_

void caricamento(s_pers perso[5])

#endif /* STRUCT_H_ */

и другой исходный файл с функцией (struct.c):

#include <stdlib.h>
#include <stdio.h>

typedef struct{
    char nome[29];
    char cognome[28];
    int et;
}s_pers;

void caricamento(s_pers* perso[5]){
    int k;

    for(k=0;k<=5;k++){
        printf("Inserisci nome dello studente: ");
        scanf("%s", perso[k]->nome);

        printf("Inserisci cognome dello studente: ");
        scanf("%s", perso[k]->cognome);

        printf("Inserisci l'eta' dello studente: ");
        scanf("%d", &perso[k]->et);
    }
}

Хорошо, есть все файлы, которые я использовал. Проект сборки Eclipse, без ошибок, но, когда я вставляю первую строку, приложение перестает работать и вылетает. Я пытаюсь создать другое приложение, как это, но без использования массива структуры, и он работает отлично ... Как мне решить это?

Спасибо !!

1 Ответ

0 голосов
/ 02 мая 2018

Ваш заголовок не используется вообще. Было бы лучше определить структуру в заголовке и включить заголовок в исходные файлы (как упомянуто в комментариях выше).

#ifndef STRUCT_H_
#define STRUCT_H_

typedef struct{
    char nome[29];
    char cognome[28];
    int et;
} s_pers;

void caricamento(s_pers *perso)

#endif /* STRUCT_H_ */

Затем в вашем main.c include заголовке и, как также упоминается в комментариях, передается personaX. В противном случае вы бы передали адрес шестого элемента, которого даже не существует! Поскольку массивы начинаются с 0, вы можете выполнять итерацию только до k < 5.

#include <stdlib.h>
#include <stdio.h>
#include <struct.h>    /* include your header! */

/* 
  Structure already defined in header, 
  no need to define it here! 
 */

int main(){
    s_pers personaX[5];

    caricamento(personaX);

    int i;
    for(i=0;i<5;i++){
        printf("Nome: %s\t Cognome: %s\t Eta': %d\n", 
            personaX[i].nome, personaX[i].cognome, personaX[i].et);
    }

    system("pause");
}

В вашем struct.c обязательно включите ваш заголовок и убедитесь, что ваша функция соответствует объявлению функции в вашем файле заголовка! Снова убедитесь, что остановились на 5, поэтому используйте k < 5.

#include <stdlib.h>
#include <stdio.h>
#include <struct.h>    /* include your header! */

void caricamento(s_pers* perso){
    int k;

    for(k=0;k<5;k++){
        printf("Inserisci nome dello studente: ");
        scanf("%s", perso[k].nome);

        printf("Inserisci cognome dello studente: ");
        scanf("%s", perso[k].cognome);

        printf("Inserisci l'eta' dello studente: ");
        scanf("%d", &perso[k].et);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...