尝试调用我的deleteStudent函数时出现分段错误(核心转储)

时间:2014-11-04 19:03:49

标签: c

我尝试制作关于学生注册的计划。

这是我的头文件:

#ifndef STUDENTREGISTRATION_H_
#define STUDENTREGISTRATION_H_
typedef struct {
char name[30];
char surname[30];
char faculty[30];
char department[30];
int age;
int grade;
int count;
} STUDENT_STRUCT, *STUDENT;

STUDENT_STRUCT students[100];
STUDENT_STRUCT empty;
void *data_init();
void *data_set(STUDENT s);
void addStudent(int count,STUDENT s);
void displayList(int count);
void free_list(STUDENT s);
void deleteStudent(int index,int count);
void Choice();


#include <stdio.h>
#include <stdlib.h>
#include "string.h"
#include "StudentREGISTRATION.h"

void *data_set(STUDENT s) {

s = students;
return s;
}
void addStudent(int count,STUDENT s) {

printf("Please enter an information about student:\n");
printf("Name:");
scanf("%s", s->name);
printf("Surname:");
scanf("%s", s->surname);
printf("Faculty:");
scanf("%s", s->faculty);
printf("Department:");
scanf("%s", s->department);
printf("Age:");
scanf("%d", &s->age);
printf("Grade:");
scanf("%d", &s->grade);
students[count].age = s->age;
students[count].grade=s->grade;
strcpy(students[count].department,s->department);
strcpy(students[count].faculty,s->faculty);
strcpy(students[count].name,s->name);
strcpy(students[count].surname, s->surname);
free_list(s);
}

void displayList(int count) {
int i;
for (i = 0; i < count; i++) {
    if(students[i].name[0] != "\0" && students[i].surname[0] != "\0" && students[i].faculty[0] !=        "\0" && students[i].department[0] !="\0"&&students[i].age != 0 && students[i].grade != 0)
    {
        printf("%d.) %s %s %s %s %d %d \n", i + 1, students[i].name,
        students[i].surname, students[i].faculty,
        students[i].department, students[i].grade, students[i].age);
    }

}
}
void free_list(STUDENT s) {

free(s);
}
void deleteStudent(int index,int count) {
int i;
for(i=0;i<count;i++)
{
    if(index-1==i)
    {
        students[i].name[0]="\0";
        students[i].surname[0]="\0";
        students[i].department[0]="\0";
        students[i].faculty[0]="\0";
        students[i].age=0;
        students[i].grade=0;
    }
}
 displayList(count);
}
 void *data_init()
{
STUDENT s=(STUDENT)malloc(sizeof(STUDENT_STRUCT));
return s;
}
void Choice() {
STUDENT s;
int a=0;
printf("Enter your choice to do with a program\n");
printf("Press A for adding student\n");
printf("Press L to display a student list\n");
printf("Press D for deleting student\n");
printf("Press E for exit\n");
char choice = ' ';
int index;
while (choice != 'E') {

    printf("Your choice:");
    scanf("%c", &choice);
    switch (choice) {
    case 'A':
        s=data_init(s);
        addStudent(a,s);
        a++;
        break;
    case 'L':

        displayList(a);
        break;
    case 'D':
        printf("Enter an index:");
        scanf("%d ",index);
        deleteStudent(index,a);
        break;
    }
}

exit(1);
}

当程序试图在switch case中运行delete函数时,我得到了分段错误(code dump)错误。我在这段代码中的错误在哪里,我想它的全部都是指针。但我尝试为每个学生分配和解除分配。问题出在哪里,如果有人告诉我,我会很感激。感谢。

1 个答案:

答案 0 :(得分:1)

在做其他事情之前,我首先尝试检查索引是否在0和count之间。这可能会导致错误。此外,您似乎没有使用#endif关闭头文件中的#ifndef。

同样有人指出,scanf应该提供一个地址而不是一个变量。例如:

scanf("%d ", &z);