2015-12-06 1 views
-1

Хорошо, поэтому я довольно новичок в C и знаю только основные функции C, и я пытаюсь создать программу, которая позволяет пользователю создавать студент - структурировать и обновлять свои личные и академические детали - также структуры и члены студенческой структуры.«Ошибка сегментации» Ошибка при попытке назначить и вызвать значения вложенной структуры в C

//student.h 
struct personalDetails { 
      char name[20]; 
      char phoneNum[13]; 
      char address[30]; 
    }; 

struct classRecords { 
     int assignment; 
     int midterm; 
     int finalMark; 
     int total; 
}; 

struct student{ 
     struct personalDetails det; 
     struct classRecords rec; 
}st1, *st1_ptr, 
st2, *st2_ptr, 
st3, *st3_ptr, 
st4, *st4_ptr, 
st5, *st5_ptr; 

И всякий раз, когда я запускаю свою программу, и прийти к той части, где пользователь должен ввести значение, которое должно быть назначено или вызываемому в/из структуры я получаю ошибку сегментации. Вот то, что код выглядит как на один из примеров, когда я присваиваю значение:

//operations.c 
#include<stdio.h> 
#include"student.h" 
#include<string.h> 

extern struct personalDetails det; // name, phoneNum, address 
extern struct classRecords rec; // assignment, midterm, finalMark, total 
extern struct student st1; // student 1 
extern struct student *st1_ptr; // student 1 pointer 
extern struct student st2; 
extern struct student *st2_ptr; 
extern struct student st3; 
extern struct student *st3_ptr; 
extern struct student st4; 
extern struct student *st4_ptr; 
extern struct student st5; 
extern struct student *st5_ptr; 
struct student *studentID(int id) { // identifies student by ID 

if (id == 1) { 
     return st1_ptr; 
} 
else if (id == 2) { 
     return st2_ptr; 
} 
else if (id == 3) { 
     return st3_ptr; 
} 
else if (id == 4) { 
     return st4_ptr; 
} 
else if (id == 5) { 
     return st5_ptr; 
} 
} 
char name[20]; 
void updateName() { // updates student name 
printf("Enter student's name\n"); 
scanf("%19s", name); 

strcpy(studentID(1)->det.name, name); 

} 
void main() { 
updateName(); 
printf("Student1 Name: %s", studentID(1)->det.name); 
} 

Любых советы ценятся, но помните мое знание C довольно минимально. Имейте в виду, что я не знаю, как правильно использовать указатели (возможно, очевидно в коде), но если кто-то может объяснить, как использовать их в этом обстоятельстве, это было бы здорово. Кроме того, из того, что я видел в других сообщениях, использование malloc и sizeof, похоже, является общим ответом на такие проблемы, но если возможно, я хотел бы держаться подальше от них, потому что мой профессор не упомянул о необходимости любой из эти функции. Заранее спасибо

Edit 1: добавлена ​​инициализация к сообщению

+0

'return st1_ptr;' и т. Д., Это * uninitiliased * указатели, кроме глобальной инициализации по умолчанию, в 'NULL'. –

+0

@WeatherVane Я инициализировал их (не уверен, что я сделал правильно), но я добавлю их к сообщению – rsorce

+0

Вы дали только половину истории. Можете ли вы подготовить [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) –

ответ

0

Для начала, где являются st1_ptr, str2_ptr, назначенными и т.д. значение? - kaylum

У меня нет привязанных им ни к чему в данный момент (что я знаю)! Я думаю, что мне нужно назначить их соответственно st1, st2 и т. Д., Но я не знаю, как это сделать должным образом . - rsorce

Вам не нужны эти указатели; просто удалите все заявления о них и заменить все остальные вхождения st1_ptr с &st1 и т.д.

0

Изменить этот код

void main() { 
updateName(); 
printf("Student1 Name: %s", studentID(1)->det.name); 
} 

в

void main() { 
    st1_ptr = &st1; 
    st2_ptr = &st2; 
    st3_ptr = &st3; 
    st4_ptr = &st4; 
    st5_ptr = &st5; 
    updateName(); 
    printf("Student1 Name: %s", studentID(1)->det.name); 
} 

Это просто. Вы забыли инициализировать те указатели, которые вызвали segfault.

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