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

在学校Linux服务器中使用opendir()出现段错误求助

问题分析与修复方案

核心错误点

  • 字符串转义错误:代码中opendir("~/\");存在语法问题,C语言字符串里的反斜杠无需额外转义(除非要表示反斜杠本身),这里多写的反斜杠会导致字符串语法异常,正确写法应为opendir("~/");——但这并非主要问题。
  • opendir不解析波浪号~:C标准库函数不会像Shell那样解析~(代表用户主目录),直接传入"~/"会让系统找不到对应目录,opendir会返回NULL。
  • 空指针访问触发段错误:你先调用readdir(OGdir)再检查OGdir是否为NULL,如果opendir失败返回NULL,readdir(NULL)会直接引发段错误,这是当前问题的直接诱因。
  • 目标路径错误:你想打开当前目录,无需用~,直接传入.即可(.是当前目录的标准路径标识)。

修复后的代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <sys/types.h>
#define MAX 100

int copy(char fileName[], char dirName[])
{
    printf("0");
    
    // 打开当前目录,使用"."表示
    DIR *OGdir = opendir(".");
    // 先检查目录是否打开成功,再执行后续操作
    if(OGdir == NULL)
    {
        perror("\nUnable To Open Directory"); // 用perror打印具体错误原因,方便排查
        return(-1);
    }

    struct dirent *OGdp = readdir(OGdir);
    printf("1\n");
    
    // 遍历目录内容的代码可以写在这里
    
    closedir(OGdir); // 记得关闭目录,避免资源泄漏
    return(0);
}

补充说明

  • 如果需要打开用户主目录,不要直接用~,可以通过getenv("HOME")获取合法路径:
    char *home_dir = getenv("HOME");
    if (home_dir == NULL) {
        perror("Failed to get home directory");
        return -1;
    }
    DIR *OGdir = opendir(home_dir);
    
  • 调用系统函数后必须先检查返回值合法性,再进行后续操作,这是避免段错误的基本习惯。
  • 本次问题和SSH连接无关,完全是代码语法与逻辑错误,和你使用VSCode通过SSH连接服务器的方式没有关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:13:14