Почему я получаю ошибку сегментации при использовании printf? - PullRequest
0 голосов
/ 06 ноября 2011

Я новичок в программировании на Си.У меня проблемы с использованием функции printf.Когда я запускаю следующую программу, я получаю ошибку сегментации.Пожалуйста, скажите мне, что я делаю не так.Что на самом деле означает ошибка сегментации?

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

typedef struct
{
        char *name;
        int rollnum;
        int marks;
}
student_data;

int main()
{
        student_data stud1;                                             
        student_data *ptr;                                              

        ptr = (student_data *)malloc(sizeof(student_data));


        printf("\n NAME OF THE STUDENT:         " );
        scanf("%s", &ptr -> name);

        printf("\n ROLL NUMBER OF THE STUDENT:  " );
        scanf("%d", &ptr -> rollnum);

        printf("\n MARKS OF THE STUDENT:        " );
        scanf("%d", &ptr -> marks);


        printf("\nPRINTING ROLL NUMBER      %d", ptr -> rollnum);
        printf("\nPRINTING MARKS            %d", ptr -> marks);
        printf("\nPRINTING NAME             %s", ptr -> name);


}

-: output: -

ИМЯ СТУДЕНТА: ajish

ЧИСЛО РУЧКИ СТУДЕНТА: 2

ЗНАКИ УЧАЩИХСЯ: 60

ПЕЧАТАЮЩИЙСЯ НОМЕР РОЛИКА 2 ПЕЧАТНЫЕ ЗНАКИ 60 Ошибка сегментации

Ответы [ 5 ]

3 голосов
/ 06 ноября 2011

Вы забыли выделить немного памяти для student_data.name. Согласно документации scanf , ptr->name должен указывать на уже выделенный буфер памяти.

2 голосов
/ 06 ноября 2011

Вы никогда не выделяете память для имени.

0 голосов
/ 06 ноября 2011

Вы не выделяете память для ptr->name.

0 голосов
/ 06 ноября 2011

Вы не инициализируете ptr -> name, что приводит к неопределенному поведению в остальной части кода, используя ptr->name.

, добавьте ptr->name = (char*) malloc(1000); memset (ptr->name, 0x00, 1000); после malloc и перед первым printf.

Общее замечание:

Вам нужно всегда инициализировать указатели.При работе с scanf вы должны знать, что вы должны выделить / предоставить достаточно места для хранения того, что может быть введено / прочитано (как указано в документации) в противном случае у вас возникают проблемы с управлением памятью и безопасностью, а такжецелостность данных (например, переполнение буфера и т. д.).

0 голосов
/ 06 ноября 2011

scanf ("% s", & ptr -> name);

Вы никогда не выделяете ptr-> name.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...