2011-11-06 2 views
0

Я новичок в программировании на С. У меня проблемы с использованием функции printf. Когда я запускаю следующую программу, я получаю ошибку сегментации. Пожалуйста, скажите мне, что я делаю неправильно. Что означает ошибка сегментации?Почему я получаю ошибку сегментации при использовании 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); 


} 

-: выход: -

имя студента: ajish

Рулон КОЛИЧЕСТВО СТУДЕНТА: 2

отметками Слушатель: 60

ПЕЧАТЬ Рулон НОМЕР 2 ПЕЧАТНЫЕ МАРКИ 60 Ошибка сегментации

+2

Вам повезло: строка «ajish» была написана в неизвестном месте внутри вашей памяти компьютера, и компьютер не взорвался. В прошлый раз, когда я попробовал что-то подобное, мой компьютер начал идти к окну и выбрался, если бы я его не остановил :-) – pmg

+1

@pmg :-)) http://xkcd.com/293/ – cnicutar

+0

@pmg +1 за этот хороший комментарий! – GETah

ответ

2

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

+1

Также проблема ссылочного оператора в 'scanf ("% s ", & ptr -> name);'. – cnicutar

3

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

0

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

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

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

Вы должны всегда инициализировать указатели. При работе с scanf you need to be aware that you must allocate/provide enough space to hold whatever might be entered/read (as stated in the documentation) в противном случае возникают проблемы с управлением памятью и безопасностью и целостностью данных (например, переполнение буфера и т. Д.).

+1

Или проще определить структуру с массивом, а не с указателем: 'struct {char name [2000];/* ... * /}; ' – pmg

0

Вы не храните хранилище для ptr->name.

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