MST

星途 面试题库

面试题:C语言结构体与动态内存分配的中等应用

假设有一个结构体表示学生信息,包含姓名(字符串)、年龄和成绩。请编写一个函数,使用动态内存分配创建n个学生信息的结构体数组,并为每个学生信息分配内存,然后填充这些信息,最后返回这个结构体数组的指针。注意处理内存分配失败的情况。
47.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义学生结构体
typedef struct {
    char *name;
    int age;
    float score;
} Student;

// 创建学生结构体数组的函数
Student* createStudentArray(int n) {
    Student *students = (Student*)malloc(n * sizeof(Student));
    if (students == NULL) {
        printf("内存分配失败\n");
        return NULL;
    }

    for (int i = 0; i < n; i++) {
        char tempName[50];
        printf("请输入第 %d 个学生的姓名: ", i + 1);
        scanf("%s", tempName);

        students[i].name = (char*)malloc(strlen(tempName) + 1);
        if (students[i].name == NULL) {
            printf("内存分配失败\n");
            // 释放之前分配的内存
            for (int j = 0; j < i; j++) {
                free(students[j].name);
            }
            free(students);
            return NULL;
        }
        strcpy(students[i].name, tempName);

        printf("请输入第 %d 个学生的年龄: ", i + 1);
        scanf("%d", &students[i].age);

        printf("请输入第 %d 个学生的成绩: ", i + 1);
        scanf("%f", &students[i].score);
    }

    return students;
}

// 释放内存的函数
void freeStudentArray(Student *students, int n) {
    for (int i = 0; i < n; i++) {
        free(students[i].name);
    }
    free(students);
}

你可以使用以下方式调用这个函数:

int main() {
    int n;
    printf("请输入学生数量: ");
    scanf("%d", &n);

    Student *students = createStudentArray(n);
    if (students != NULL) {
        // 在这里可以对students数组进行操作
        for (int i = 0; i < n; i++) {
            printf("学生 %d: 姓名 %s, 年龄 %d, 成绩 %.2f\n", i + 1, students[i].name, students[i].age, students[i].score);
        }

        freeStudentArray(students, n);
    }

    return 0;
}

代码说明

  1. 定义结构体:使用typedef struct定义了Student结构体,包含name(动态分配的字符串)、age(年龄)和score(成绩)。
  2. createStudentArray函数
    • 使用malloc分配nStudent结构体的内存空间,如果分配失败,输出错误信息并返回NULL
    • 循环为每个学生分配name的内存空间,读取姓名、年龄和成绩。如果name内存分配失败,释放之前分配的内存并返回NULL
  3. freeStudentArray函数:释放每个学生name的内存空间,然后释放整个students数组的内存。
  4. main函数:读取学生数量n,调用createStudentArray创建学生数组,对数组进行操作后,调用freeStudentArray释放内存。