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

C语言程序向课程数组添加超过1项时出现Segmentation error如何解决

问题修复方案

核心Bug原因

  • 野指针写入:char *courseArray[numCourses]仅创建了指针数组,每个指针未分配可写内存,直接用scanf写入字符串会访问非法内存,是段错误的直接诱因。单课程可运行仅为随机栈内存命中可写区域的偶然情况,无稳定性。
  • 变长数组声明顺序错误:registrationTable作为变长数组,声明时numStudents、numCourses尚未赋值,数组长度为栈内随机垃圾值,后续操作会存在内存越界风险。

修复步骤

  1. 调整变长数组声明顺序,将registrationTable的声明移到numStudents、numCourses都完成用户输入赋值之后
  2. 为courseArray的每个指针分配足够存储课程代码的内存空间,建议预留足够冗余避免溢出
  3. 给scanf增加字符串长度限制,避免输入过长导致缓冲区溢出

修复后可运行代码

#include <stdio.h>
#include <stdlib.h>
#include "Functions.h"
#include <stdbool.h>

#define MAX_COURSE_CODE_LEN 20 // 可根据实际需求调整课程代码最大长度

int main()
{
    int numStudents, numCourses;

    // 先获取学生数量再创建学生数组
    printf("How many students would you like to register: \n");
    scanf("%d", &numStudents);
    int studentArray[numStudents];

    for (int i = 0; i < numStudents; i++)
    {
        printf("Please enter the student ID for student %d: \n", i + 1);
        scanf("%d", &studentArray[i]);
    }

    // 获取课程数量
    printf("How many courses are you offering: \n");
    scanf("%d", &numCourses);
    
    // 两个长度参数都已赋值,再声明注册表变长数组
    int registrationTable[numStudents][numCourses];
    char *courseArray[numCourses];

    for (int i = 0; i < numCourses; i++)
    {
        // 给每个课程代码指针分配内存,+1是留给字符串结束符'\0'
        courseArray[i] = (char*)malloc(sizeof(char) * (MAX_COURSE_CODE_LEN + 1));
        printf("Please enter the course code for course %d: \n", i + 1);
        // 增加长度限制避免输入溢出
        scanf(" %20s", courseArray[i]);
    }

    validate(studentArray, courseArray, numStudents, numCourses);

    // 用完释放内存避免泄漏
    for (int i = 0; i < numCourses; i++)
    {
        free(courseArray[i]);
    }

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:18:00