2013-06-23 4 views
0

Я пытаюсь написать простую программу для сбора данных для определенного количества студентов и вывода ее в конце. После ввода данных для одного ученика моя программа выйдет из строя.простой указатель на структуры

Вот код:

#include <stdio.h> 
#include <stdlib.h> 
typedef struct Student Student; 
struct Student{ 
    char name[20]; 
    char lastname[20]; 
    int age; 
}; 

main() { 
    int i; 
    int n; 
    scanf("%d",&n); 


    Student *pStudents = NULL; 
    pStudents = (Student*)malloc(n*sizeof(Student)); 

    for(i=0;i<n;i++) { 
     printf("Enter the students name: \n"); 
     scanf("%s",(pStudents+i)->name); 
     printf("Enter lastname: \n"); 
     scanf("%s",(pStudents+i)->lastname); 
     printf("Enter age: \n"); 
     scanf("%d",(pStudents+i)->age); 
    } 

    for(i=0;i<n;i++) { 
     printf("%s",(pStudents+i)->name); 
     printf("%s",(pStudents+i)->lastname); 
     printf("%d",(pStudents+i)->age); 
    } 

} 

Спасибо заранее.

+0

Ошибка была, очевидно, scanf, но почему вы используете (pStudents + i) вместо pStudents [i]? Это, по крайней мере, показало бы, что pStudents - это массив. –

+0

Справа. Я забыл указатель - это то же самое, что и массив. Я по-прежнему новичок в указателях, но это, безусловно, делает код более понятным для чтения. – Jay

+0

Присвоение 'NULL'' pStudents' полностью избыточно; возвращаемое значение 'malloc()' перезаписывается немедленно. –

ответ

5
scanf("%d",(pStudents+i)->age); 

аргумент scanf должен быть типа указателя.

Изменение (pStudents+i)->age по &(pStudents+i)->age.

+0

Работает! Я предполагаю, что оператор -> тот же, что и. но и различия? – Jay

+0

@ Вы используете '.' для доступа к члену структурной переменной (например,' struct Student variable') и '->', когда у вас есть указатель на структуру (например, 'struct Student * pointerVariable'). –

+1

@Jay 's-> a' является синтаксическим сахаром для' (* s) .a' – ouah

Смежные вопросы