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

使用数组时触发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;
}

修正说明

  1. 调整数组定义顺序,先获取学生数量再创建数组,确保数组大小正确。
  2. 给名字数组分配足够长度,避免字符串越界。
  3. 修正二维数组的索引顺序,学生索引在前,课程索引在后,且课程索引从0到5。
  4. 修复字符串输入输出的错误,确保传递正确的指针给scanf和printf。
  5. 修复%符号的转义问题,同时实现了总分sum的计算和输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 02:35:19