getenv 返回只读内存地址,不可修改或释放;需判空后拷贝为 std::string 再转换;跨平台注意大小写与变量名差异;其值为进程启动时快照,不反映后续环境变化。
getenv 是 C 标准库函数,C++ 中可直接使用,但它不抛异常、不检查参数、返回 const char*,且环境变量不存在时返回 nullptr —— 这些是实际编码中最容易出错的地方。
getenv 返回的指针不能 delete 或修改它指向的是进程启动时由操作系统映射进来的只读内存区域(通常是 environ 数组中某个字符串的起始地址)。任何写操作(比如 strcpy(buf, getenv("HOME")))都可能触发段错误;用 delete 或 free 释放更是未定义行为。
std::string 或 std::vector 拷贝内容,例如:std::string home = getenv("HOME") ? getenv("HOME") : "";getenv 返回值做指针算术或强制转为 char* 后写入getenv 是线程安全的,但修改环境变量(如 putenv)会破坏该保证getenv 在 Windows 和 Linux 下的行为差异大小写敏

getenv("PATH") 和 getenv("path") 结果不同;Windows 下两者通常都返回相同值(系统内部做了不区分大小写的查找)。
"HOME"、"TMPDIR")"CommonProgramFiles(x86)")也能被正确识别,但 Linux shell 不支持这类命名,所以一般不会遇到getenv 在 Windows 上能读到 USERPROFILE,但在 WSL 或 Linux 原生环境下得用 HOME
不能直接对 getenv 返回值调用 std::stoi 或逻辑判断——因为可能为 nullptr,会导致解引用崩溃。
const char* val = getenv("LOG_LEVEL");
int level = val ? std::stoi(val) : 1;DEBUG=1、VERBOSE=true):bool verbose = []{
const char* v = getenv("VERBOSE");
return v && (std::string(v) == "1" || std::string(v) == "true" || std::string(v) == "on");
}();getenv:同一变量多次读取建议缓存一次结果,尤其在循环或高频路径中最常被忽略的一点:环境变量是在进程启动时快照的,getenv 不会感知后续父进程或同级进程对环境的修改;子进程继承的是 fork 时刻的副本,不是实时视图。