【问题标题】:How to allocate memory to a typedef struct within array of structs如何为结构数组中的 typedef 结构分配内存
【发布时间】:2019-10-28 02:32:04
【问题描述】:

我一直在尝试为指针变量分配内存,但它一直给我错误或分段错误。如何正确初始化指向课程结构的指针变量?

 typedef struct {
    char courseId[7];
    char courseName[10];
    } Course;

    struct Student{
    char firstName[10];
    char lastName[10];
    int studentId;
     Course *course;
    };

int main() {
  int numStudents;
  printf("How many students do you wish to register?: ");
  scanf("%d", &numStudents);
  struct Student *student[numStudents];
  student[numStudents] = malloc(sizeof(*student[numStudents]));
  student[numStudents]->course = malloc(sizeof*(numStudents * Course));
  for (int i = 0; i < numStudents; i++) {
    printf("Enter student #%d First Name: ", i+1);
    scanf("%s", student[i]->firstName);
    printf("Enter student Last Name: ");
    scanf("%s", student[i]->lastName);
    printf("Enter Student ID: ");
    scanf("%d", &student[i]->studentId);
    printf("Enter Course ID: ");
    //student[i]->course = malloc(sizeof(*(student[i]->course)));
    scanf("%s", student[i]->course->courseId);
    printf("Enter Cousrse Name: ");
    //student[i]->course = malloc(sizeof(*(student[i]->course)));
    scanf("%s", student[i]->course->courseName);
  }

  for (int i = 0; i < numStudents; i++) {
    printf("Student Name: %s %s\n", student[i]->firstName, student[i]->lastName);
    printf("Student ID: %d\n", student[i]->studentId);
    printf("Course Code: %s\n", student[i]->course->courseId );
    printf("Course name: %s\n", student[i]->course->courseName);
    free(student[i]->course);
  }

【问题讨论】:

  • 避免无宽度scanf("%s", student[i]-&gt;firstName); 字符串输入。最好使用char firstName[10]; .... scanf("%9s", student[i]-&gt;firstName);

标签: c


【解决方案1】:

您几乎完成了,需要进行一些更正。 Student 中的课程对象不需要是指针。 Student 结构的数组需要动态分配,然后再释放。 -&gt; 用作取消引用运算符,但在您的情况下,[] 已经取消引用,因此您将使用. 而不是-&gt;,并且当您为结构数组分配内存时,它需要是结构的大小乘以结构的数量。 malloc(sizeof(struct Student)*numStudents);

typedef struct {
    char courseId[7];
    char courseName[10];
} Course;

struct Student{
    char firstName[10];
    char lastName[10];
    int studentId;
    Course course;
};

int main() {
    int numStudents;
    printf("How many students do you wish to register?: ");
    scanf("%d", &numStudents);
    struct Student* students = malloc(sizeof(struct Student)*numStudents);
    for (int i = 0; i < numStudents; i++) {
        printf("Enter student #%d First Name: ", i+1);
        scanf("%s", students[i].firstName);
        printf("Enter student Last Name: ");
        scanf("%s", students[i].lastName);
        printf("Enter Student ID: ");
        scanf("%d", &students[i].studentId);
        printf("Enter Course ID: ");
        scanf("%s", students[i].course.courseId);
        printf("Enter Cousrse Name: ");
        scanf("%s", students[i].course.courseName);
    }

    for (int i = 0; i < numStudents; i++) {
        printf("Student Name: %s %s\n", students[i].firstName, students[i].lastName);
        printf("Student ID: %d\n", students[i].studentId);
        printf("Course Code: %s\n", students[i].course.courseId );
        printf("Course name: %s\n", students[i].course.courseName);
    }
    free(students);
    return 0;
}

我尝试对您的代码进行最小的更改。

【讨论】:

  • 您的回答帮了我大忙,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2020-02-03
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 2016-01-12
  • 2020-09-03
相关资源
最近更新 更多