You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C中用动态数组存储学生结构体时出现段错误的问题排查

问题原因分析

你遇到的段错误核心问题是:你只给studentList结构体本身分配了内存,但结构体内部的students指针还是一个野指针(指向无效内存地址),直接访问它的成员会触发非法内存访问。

具体来说:

  • 当你执行malloc(sizeof(studentList))时,只是给list这个结构体对象分配了内存,其中的students成员作为指针,默认值是随机的垃圾值,并没有指向一块真正能存放student结构体的内存空间。
  • 此时去操作list->students->matrikelNummer或list->students->name,本质是在读写不属于你的内存区域,操作系统会立刻抛出段错误来阻止这种危险行为。
修正后的代码

要解决这个问题,你需要在初始化studentList后,给students指针分配足够的内存空间。同时还要注意内存释放的顺序,避免内存泄漏:

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

typedef struct s_student { char name[64]; int matrikelNummer; } student;
typedef struct s_studentList { student* students; int numberOfStudents; } studentList;

int main(int argc, char** argv) {
    studentList* list = NULL;
    list = (studentList*) malloc(sizeof(studentList));
    // 必须检查malloc是否成功,避免内存分配失败后的非法操作
    if (list == NULL) {
        fprintf(stderr, "Failed to allocate memory for studentList\n");
        return 1;
    }

    list->numberOfStudents = 1;
    // 关键步骤:给students指针分配对应数量的student内存
    list->students = (student*) malloc(list->numberOfStudents * sizeof(student));
    if (list->students == NULL) {
        fprintf(stderr, "Failed to allocate memory for students\n");
        free(list); // 已经分配的list要先释放,避免内存泄漏
        return 1;
    }

    // 现在可以安全地操作学生数据了
    list->students->matrikelNummer = 1;
    strcpy(list->students->name , "karim");

    printf("numberOfStudents : %d\n" , list->numberOfStudents );
    printf("matrikelNummer : %d\n" , list->students->matrikelNummer);
    printf("name : %s\n" , list->students->name); // 这里你之前用%d是错误的,字符串要用%s输出

    // 释放内存的顺序:先释放内部动态分配的students,再释放外层的list
    free(list->students);
    free(list);
    return 0;
}
额外注意事项
  • 每次调用malloc后一定要检查返回值是否为NULL,内存分配失败是常见情况,不检查会导致后续操作崩溃。
  • 你原代码中输出name时用了%d格式符,这是错误的,字符串应该用%s,否则会输出字符串的首地址而非内容。
  • 释放内存时要遵循“先内部后外部”的顺序,先释放students指向的内存,再释放list本身,否则会造成内存泄漏。

内容的提问来源于stack exchange,提问作者Ahmad Dh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:18:49