2016-12-14 5 views
0

Я пытаюсь сделать массив структур с помощью таНоса выделить память, необходимую как так:Использования таНоса выделить память для массива

typedef struct stud{ 
    char stud_id[MAX_STR_LEN]; 
    char stud_name[MAX_STR_LEN]; 
    Grade* grd_list; 
    Income* inc_list; 
}Stud; 

Stud* students = malloc(sizeof(Stud)*STUDENT_SIZE); 

Проблема заключается в том, что у меня есть функция, которая добавляет id и name на место в массиве, как так:

void new_student(Stud* students[], int stud_loc){ 
    scanf("%s", students[stud_loc]->stud_id); 
    printf("%s", students[stud_loc]->stud_id); 
    scanf("%s", students[stud_loc]->stud_name); 
    printf("%s", students[stud_loc]->stud_name); 
} 

Но после первого вызова функции, которая работает, второй дает мне ошибку:

Segmentation fault (core dumped) 

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

Stud students[STUDENT_SIZE]; 

но в этом случае я должен использовать malloc.

Я попытался использовать calloc, но все равно получаю ту же ошибку.

+0

ли вы (не) проверить возвращаемое значение 'таНос()'? –

+1

Создайте [mcve], который демонстрирует проблему. Я хотел бы видеть, как вы передали значение «Stud *» функции, которая принимает «Stud * []». –

+0

'new_student (Stud * students [], ...' равно 'new_student (Stud ** students, ...'. Но вы хотите 'new_student (Stud * students, ...'. Компилятор должен был предупредить вы об этом. – alk

ответ

4

Существует несовпадение между локальной переменной Stud *students и параметром функции Stud *students[]. Эти две переменные должны иметь один и тот же тип.

Локальная переменная и malloc() хорошо выглядят. new_student имеет нежелательный дополнительный слой указателей. Он должен выглядеть следующим образом, вместо:

void new_student(Stud* students, int stud_loc){ 
    scanf ("%s", students[stud_loc].stud_id); 
    printf("%s", students[stud_loc].stud_id); 
    scanf ("%s", students[stud_loc].stud_name); 
    printf("%s", students[stud_loc].stud_name); 
} 

Вы бы тогда называть это так:

Stud* students = malloc(sizeof(Stud)*STUDENT_SIZE); 

new_student(students, 0); 
new_student(students, 1); 
new_student(students, 2); 
Смежные вопросы