使用数组时触发Core Dump错误:为何出现Segmentation Fault?
段错误原因分析及代码修正
你的代码触发段错误(segmentation fault)是由多个数组访问越界、初始化逻辑错误导致的,具体问题如下:
数组初始化时机错误
你在numofstudents初始为0时就定义了names和modules数组,此时数组大小为0。后续输入学生数量后,数组不会自动扩容,写入、读取这些数组时必然访问非法内存,直接触发段错误。必须先获取学生数量,再定义数组(或动态分配内存)。名字数组长度严重不足
char names[numofstudents][1]中每个名字仅分配1个字符空间,输入"test"这类字符串时,会超出数组范围写入,破坏内存布局。需要给名字分配足够长度,比如20(足够存储常见姓氏)。二维数组索引完全颠倒
modules数组定义为[numofstudents][6],第一个维度是学生索引,第二个是课程索引(0到5对应6门课)。但你输入和输出时用了modules[1][i]、modules[6][i],不仅把学生和课程的索引顺序搞反,还访问了超出数组范围的索引(课程索引最大为5,你用到了6),直接越界访问内存。字符串输入/输出错误
- 输入名字时,
scanf("%s", &names[i]);中names[i]已经是字符串首地址,不需要加&,直接写names[i]即可。 - 输出名字时,
printf("%4s\t", names[i][1]);错误地把单个字符names[i][1]传给%s格式符,%s需要字符串指针,这会导致非法内存访问,应直接传names[i]。
- 输入名字时,
格式符转义错误
输出分数时用了%4i\%\t,要输出%符号需要用%%,否则会导致格式解析错误。
修正后的代码
#include <stdio.h> int main() { int numofstudents = 0; int i; int sum; printf("Enter number of students: "); scanf("%i", &numofstudents); // 先获取学生数再定义数组,名字长度设为20 char names[numofstudents][20]; int modules[numofstudents][6]; for (i = 0; i < numofstudents; ++i) { printf("\nFor student %d,\n", i + 1); printf("Enter Surname: "); scanf("%s", names[i]); // 去掉多余的& printf("Enter Mark for MOD100: "); scanf("%i", &modules[i][0]); // 修正索引顺序:学生i的第0门课 printf("Enter Mark for MOD101: "); scanf("%i", &modules[i][1]); printf("Enter Mark for MOD102: "); scanf("%i", &modules[i][2]); printf("Enter Mark for MOD103: "); scanf("%i", &modules[i][3]); printf("Enter Mark for MOD104: "); scanf("%i", &modules[i][4]); printf("Enter Mark for MOD105: "); scanf("%i", &modules[i][5]); } printf("Student\tName\t\tMOD100\tMOD101\tMOD102\tMOD103\tMOD104\tMOD105\tOverall\n"); for (i = 0; i < numofstudents; ++i) { sum = modules[i][0] + modules[i][1] + modules[i][2] + modules[i][3] + modules[i][4] + modules[i][5]; printf("%4d\t%-10s\t%4d%%\t%4d%%\t%4d%%\t%4d%%\t%4d%%\t%4d%%\t%4d\n", i + 1, names[i], modules[i][0], modules[i][1], modules[i][2], modules[i][3], modules[i][4], modules[i][5], sum); } return 0; }
修正说明
- 调整数组定义顺序,先获取学生数量再创建数组,确保数组大小正确。
- 给名字数组分配足够长度,避免字符串越界。
- 修正二维数组的索引顺序,学生索引在前,课程索引在后,且课程索引从0到5。
- 修复字符串输入输出的错误,确保传递正确的指针给
scanf和printf。 - 修复
%符号的转义问题,同时实现了总分sum的计算和输出。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

