首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学生结构问题

学生结构问题
EN

Stack Overflow用户
提问于 2015-06-17 05:36:08
回答 3查看 94关注 0票数 1

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

  • 对于loadStudentData()函数,我希望将newNameNewScore存储到newStudent结构中。
  • 对于printStudentData(),我想打印单个学生的数据
  • 然后,对于printStudentArray(),我想为每个成员调用printStudentData()函数。

我的代码是:

代码语言:javascript
复制
#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);
   } 
   }
EN

回答 3

Stack Overflow用户

发布于 2015-06-17 05:38:12

  • 点1: Student students[numberOfStudents];无效,因为numberOfStudents未初始化。
  • 点2:在您的代码中,在填充student本身之前调用printStudentArray() 此函数尝试访问name变量处未初始化的内存,这将导致未定义行为
  • 点3:在loadStudentData()函数中使用未初始化的i。又来了。

尽管如此,

  1. 在使用重调指针之前,始终检查malloc()的成功与否。
  2. 不要铸造 malloc()和家庭在C中的返回值。
票数 0
EN

Stack Overflow用户

发布于 2015-06-17 05:38:23

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

更具体地说,问题可能是当您试图打印名称时,因为name指针可以指向任何地方。

票数 0
EN

Stack Overflow用户

发布于 2015-06-17 08:57:54

您似乎没有分配正在创建的结构。请注意,当您声明诸如Student *newStudent;这样的变量时,您首先必须分配它。因为到目前为止,您只声明了一个包含指向结构的Student指针的变量,但是这个指针没有指向任何位置。因此,在任何地方都可以使用malloc函数,这是一个有效的指针:

newStudent = malloc(sizeof(newStudent));

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30883017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档