在学校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
相关产品推荐
相关产品推荐

