C语言程序向课程数组添加超过1项时出现Segmentation error如何解决
问题修复方案
核心Bug原因
- 野指针写入:
char *courseArray[numCourses]仅创建了指针数组,每个指针未分配可写内存,直接用scanf写入字符串会访问非法内存,是段错误的直接诱因。单课程可运行仅为随机栈内存命中可写区域的偶然情况,无稳定性。 - 变长数组声明顺序错误:
registrationTable作为变长数组,声明时numStudents、numCourses尚未赋值,数组长度为栈内随机垃圾值,后续操作会存在内存越界风险。
修复步骤
- 调整变长数组声明顺序,将
registrationTable的声明移到numStudents、numCourses都完成用户输入赋值之后 - 为
courseArray的每个指针分配足够存储课程代码的内存空间,建议预留足够冗余避免溢出 - 给
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
相关产品推荐
相关产品推荐

