首页 > 解决方案 > envz_get 和 getenv 是否引用相同的环境变量池?

问题描述

如果后者通过可选getenv()参数传递给?envz_get()envpint main (int argc, char *argv[], char *envp[])

换句话说,可选envp参数是否int main (int argc, char *argv[], char *envp[])引用了相同的环境变量池getenv()

标签: cglibcgetenv

解决方案


根据我的经验,是的,它们是相同的。如果不是,getenv() 似乎不会特别有用。这不是我几十年来测试过的东西,但是为了回答你的问题,我只是进行了一个测试,虽然标准允许 getenv() 使用静态内存区域进行返回,但它的返回值都指向到 main 的第三个参数中等号之后的第一个字符。这是我模糊的回忆,这也发生在我最后一次做这个测试时,虽然那是一个不同的 unix 系统。

话虽如此,看看标准,或者尽可能接近我可以合理地得出的结论......来自最后一个免费提议的 C17 草案:

getenv 函数在主机环境提供的环境列表中搜索与 name 指向的字符串匹配的字符串。环境名称集和更改环境列表的方法是实现定义的。getenv 函数不需要避免与修改环境列表的其他执行线程的数据竞争。305)

实现的行为就像没有库函数调用 getenv 函数一样。返回 getenv 函数返回一个指向与匹配列表成员关联的字符串的指针。指向的字符串不应被程序修改,但可能会被后续调用 getenv 函数覆盖。如果找不到指定的名称,则返回空指针。

305) 许多实现提供了修改环境列表的非标准功能。

这基本上意味着,可能,但 C 语言并不能完全保证它。


推荐阅读