传入"PATH"作为参数时,getenv函数的实际运行原理是什么
第二层for循环的逻辑
所有环境变量都以变量名=值的格式存储为字符串,第二层循环的作用就是匹配当前遍历到的环境变量的名称部分和你传入的name是否一致:
- 循环的执行条件是
environ[i][j] != '=',意思是从当前环境变量字符串的首字符开始遍历,直到遇到等于号就停止遍历,等于号之前的部分就是环境变量的名称。 - 遍历过程中如果发现任意一个字符和
name对应位置的字符不相等,就会把status设为0,标记当前环境变量不是要找的目标,直接跳出循环。
返回地址加1的原因
当第二层循环终止时,计数器j正好停在等于号的下标位置。我们需要返回的是等于号后面的环境变量值,所以给j加1就是跳过等于号,直接指向值的第一个字符的内存地址。
举个具体示例更容易理解:
假设当前遍历的环境变量是PATH=/usr/bin:/bin,它的字符下标对应关系如下:
| 下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | ... |
|---|---|---|---|---|---|---|---|---|
| 字符 | P | A | T | H | = | / | u | ... |
当匹配到name为PATH时,循环终止时j=4,对应的字符是=:
- 如果返回
&environ[i][j],得到的字符串是=/usr/bin:/bin,包含了多余的等于号 - 如果返回
&environ[i][j+1],得到的字符串是/usr/bin:/bin,正好是我们需要的PATH变量的值
注:这个简化实现有个隐含前提:传入的
name参数本身不包含=字符,且长度和目标环境变量的名称长度完全一致,否则可能出现匹配错误。
内容的提问来源于stack exchange,提问作者NoahVerner
相关产品推荐
相关产品推荐

