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

C代码运行触发Segmentation fault (core dumped)错误求助

解决你的C程序段错误问题

咱们一步步来排查代码里的问题,导致段错误的核心原因和几个必须修复的点如下:

1. 未检查命令行参数是否存在(直接触发段错误)

你代码里直接取argv[1]转换整数,但如果运行程序时没传入任何参数,argv[1]是NULL指针,这时候调用atoi(x)会直接访问无效内存,触发Segmentation fault。

必须先判断argc的值,确保用户传入了参数:

if (argc < 2) {
    fprintf(stderr, "请传入分割份数作为参数!\n");
    exit(EXIT_FAILURE);
}

2. split命令的选项错误

你调用execlp时用的是"l",但split命令指定每行分割行数的选项是"-l"——少了减号的话,split会把"l"当成要处理的文件名,这会导致命令执行失败(虽然不是当前段错误的直接原因,但也是必须修复的问题)。

3. 未验证split值的合法性

  • 如果用户传入的不是有效整数(比如字符串),atoi会返回0,这时候320000/split会触发除以0的错误,同样会导致程序崩溃。
  • 另外split必须是正整数,否则分割逻辑没有意义,需要额外检查。

修复后的完整代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <string.h>
#include <sys/types.h>

int main(int argc, char *argv[]){
    int split;
    pid_t childpid;
    char *x = argv[1];
    int status;
    char splitindex_string[40];

    // 检查参数是否存在
    if (argc < 2) {
        fprintf(stderr, "错误:请传入分割份数作为命令行参数!\n");
        exit(EXIT_FAILURE);
    }

    // 转换并验证split值
    split = atoi(x);
    if (split <= 0) {
        fprintf(stderr, "错误:分割份数必须是正整数!\n");
        exit(EXIT_FAILURE);
    }

    printf("分割份数:%d\n" ,split );
    int indexfile_split = 320000/split;
    snprintf(splitindex_string,40, "%d", indexfile_split);

    childpid = fork();
    if(childpid==0){
        // 修复split的选项为"-l"
        execlp("/bin/split", "split", "-l", splitindex_string, "-a", "1" ,"-d", "input.txt", "output", NULL);
        // 如果execlp执行失败,打印错误信息
        perror("execlp执行失败");
        exit(EXIT_FAILURE);
    } else{
        wait(&status);
        return 0;
    }
}

额外说明

  • 我在子进程里加了perror,如果execlp执行失败(比如找不到input.txt、权限不足),会打印具体的错误原因,方便后续排查。
  • 运行程序时记得传入正整数参数,比如:./your_program 4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:47:46