getcwd函数用于获取当前工作目录绝对路径:成功返回路径指针,失败返回null并设errno;支持null缓冲区自动malloc分配(需手动free),推荐c++17用std::filesystem::current_path()替代。

用 getcwd 获取当前工作目录(POSIX/Linux/macOS)
getcwd 是最直接的方式,但它需要你手动分配缓冲区,并注意返回值检查。不传 NULL,否则行为未定义(glibc 虽支持但非标准)。
- 缓冲区大小至少为
PATH_MAX(Linux 通常为 4096),但某些文件系统路径可能超长,建议用getcwd(nullptr, 0)让系统自动分配(C++17 起更安全) - 必须检查返回值是否为
nullptr:出错时返回空指针,errno会设为ENOMEM或ERANGE - 示例:
char* cwd = getcwd(nullptr, 0); if (cwd == nullptr) { perror("getcwd failed"); return; } std::string path(cwd); free(cwd); // 注意:必须 free,不是 delete
Windows 下用 GetCurrentDirectoryA 或 GetCurrentDirectoryW
Windows 不支持 getcwd(nullptr, 0),必须预先分配足够空间。推荐用宽字符版本避免编码问题,尤其路径含中文时。
- 第一个参数是缓冲区大小(含终止符),不是最大路径长度;传 0 会返回所需大小,不写入内容
- 常见错误:传入栈上固定大小数组(如
char buf[260]),但 Windows 路径上限实际是 32767(启用长路径后),260 容易截断 - 推荐做法:
DWORD size = GetCurrentDirectoryW(0, nullptr); std::vector<wchar_t> buf(size); GetCurrentDirectoryW(size, buf.data());</wchar_t>
再转std::filesystem::path或 UTF-8 字符串
C++17 起统一用 std::filesystem::current_path()
这是跨平台最省心的选择,底层自动调用对应系统 API,且返回 std::filesystem::path,天然支持路径拼接、遍历等操作。
- 头文件需包含
<filesystem></filesystem>,链接时加-lstdc++fs(GCC)或确保 C++17 模式开启(MSVC 默认支持) - 出错时抛
std::filesystem::filesystem_error,不是返回空值,务必 try/catch - 示例:
try { auto p = std::filesystem::current_path(); std::string s = p.string(); // UTF-8 on Linux/macOS, locale-encoded on older Windows } catch (const std::filesystem::filesystem_error& e) { // 处理权限不足、路径被卸载等情况 }
为什么不用 argv[0] 或 GetModuleFileName?
这些获取的是可执行文件所在目录,不是进程当前工作目录(chdir 后二者就不同了)。常见误用场景:
- 用户启动程序时在 /tmp 下执行
./myapp,工作目录是/tmp,但argv[0]解析出的路径是./myapp或绝对路径如/home/user/myapp -
GetModuleFileName返回的是 EXE 文件磁盘位置,和cd /var/log && ./myapp中的实际工作目录无关
真正需要“当前工作目录”时,只应依赖 getcwd、GetCurrentDirectory 或 std::filesystem::current_path。
跨平台项目里最容易忽略的是错误处理粒度——std::filesystem::current_path() 看似简单,但抛异常的条件比想象中多(比如 NFS 挂载点临时不可达),而 C 风格函数的 errno 检查又容易被遗漏。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











