学生结构问题

时间:2015-06-17 05:36:09

标签: c arrays function pointers struct

我正在学习structs,我仍然对他们及其所做的事情感到困惑。我的代码是我的尝试,我不断得到分段错误。我的主要目标是让用户在调用函数时查看他们想要添加的学生数量以及名称和分数的每个信息。我还想将数据阵列打印给用户。

  • 对于loadStudentData()函数,我想将newNameNewScore存储到newStudent结构中。

  • 对于printStudentData()我想为单个学生打印数据

  • 然后对于printStudentArray(),我想在学生数组的每个成员上调用printStudentData()函数。

我的代码是:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STUDENT_NAME_LENGTH 20

typedef struct{
char* name;
int score;
}Student;

void loadStudentData(Student *newStudent,char* newName,int newScore);
int printStudentData(Student student);
void printStudentArray(Student* students, int numStudents);


/*
 *
 */
int main(int argc, char** argv) {
int numberOfStudents;
Student *newStudent;
char* newName;
int newScore;
int student;


Student students[numberOfStudents];

printf("how many students: ");
scanf("%d", &numberOfStudents);


    loadStudentData(newStudent, newName, newScore);

    printStudentArray(students, numberOfStudents);


  return (EXIT_SUCCESS);
}

void loadStudentData( Student *newStudent, char* newName, int newScore){
 int i;
    char *studentName = (char *) malloc(STUDENT_NAME_LENGTH *  sizeof(char));
    scanf("%s", studentName);
    newStudent->name = studentName;

    int nScore;
    scanf("%d", &nScore);
    newStudent[i].score = newScore;
  }
 int printStudentData(Student student){

int i;

    printf("Student name\t%s\n",) ;
    printf("Student score\t%d\n",);

     }



 void printStudentArray(Student* students, int numStudents){
 int i;
for (i = 0; i < numStudents; i++) {
    printf("Student name\t%s\n", students[i].name);

    printf("Student score\t%d\n", students[i].score);
   } 
   }

3 个答案:

答案 0 :(得分:0)

  • 第1点 DirectionsRenderer无效,因为Student students[numberOfStudents];未初始化。

  • 第2点:在您的代码中,您在填充numberOfStudents之前正在调用printStudentArray()

    此函数尝试访问导致undefined behaviourstudent变量的未初始化内存。

  • 第3点:在name功能中,您使用loadStudentData()未初始化。再次UB。

那就是说,

  1. 在使用重新调整的指针之前,请务必检查i是否成功。
  2. malloc() malloc()C家人的回复价值do not cast

答案 1 :(得分:0)

在实际初始化结构数组之前调用printStudentArray。这意味着数组中的所有数据都将不确定并以任何方式使用它,除了初始化它将导致未定义的行为(这是崩溃的常见原因)。

更具体地说,问题可能是当您尝试打印名称时,因为name指针可以将指向

答案 2 :(得分:0)

您似乎没有分配您正在创建的结构。请注意,当您声明Student *newStudent;之类的变量时,首先必须分配。因为到目前为止,您只声明了一个将指针保存到Student结构的变量,但是这个指针指向无处。因此,在期望有效指针的任何地方使用malloc函数:

newStudent = malloc(sizeof(newStudent));