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

运行C程序出现segmentation fault (core dumped)错误的原因及解决方法

问题分析:fork演示程序的段错误原因及修复方案

错误原因

  • 未检查命令行参数数量就直接访问argv[1]和argv[2]:如果运行程序时没有传入足够的命令行参数,argv[1]或argv[2]会是NULL指针,调用atoi(NULL)会触发段错误——因为atoi会尝试读取NULL指向的内存区域,属于非法内存访问操作。

修复方案

在使用argv之前先校验命令行参数的数量,确保至少传入2个参数;如果参数不足,打印使用提示并退出程序。修改后的代码如下:

/*
 * Illustrates system call fork
 */

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

int
main (
  int argc,
  char *argv[]
  )
{
  int tC, tF;
  pid_t pid;

  // 检查命令行参数是否足够
  if (argc < 3) {
    fprintf(stderr, "用法: %s <子进程休眠时间> <父进程休眠时间>\n", argv[0]);
    exit(EXIT_FAILURE);
  }

  tC = atoi (argv[1]);
  tF = atoi (argv[2]);

  fprintf (stdout, "Main  :                  ");
  fprintf (stdout, "PID=%d; My parent PID=%d\n",
    getpid(), getppid());

  pid = fork();
  if (pid == 0){
    // Child
    sleep (tC);

    fprintf(stdout, "Child : PIDreturned=%d    ", pid);
    fprintf (stdout, "PID=%d; My parent PID=%d\n",
      getpid(), getppid());
  } else {
    // Father
    sleep (tF);

    fprintf(stdout, "Father: PIDreturned=%d ", pid);
    fprintf (stdout, "PID=%d; My parent PID=%d\n",
      getpid(), getppid());
  }

  return 0;
}

补充说明

  • 修复后运行程序时,需要传入两个整数参数,例如:./fork_demo 2 3,代表子进程休眠2秒、父进程休眠3秒。
  • 参数检查逻辑能在参数不足时给出明确提示,从根源避免非法内存访问导致的段错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 08:10:54