getenv, getenv_s
来自cppreference.com
在标头 <stdlib.h> 定义
|
||
char *getenv( const char *name ); |
(1) | |
errno_t getenv_s( size_t *restrict len, char *restrict value, rsize_t valuesz, const char *restrict name ); |
(2) | (C11 起) |
1) 在宿主指定的环境列表中,查找名为
name
的环境变量,并返回关联到匹配环境变量的字符串。环境变量的集合及修改它的方法是实现定义的。 此函数不保证是线程安全的。另一个对
getenv
的调用,和对 POSIX 函数 setenv() 、 unsetenv() 及putenv() 的调用,可能会使先前的调用返回的指针非法,或者修改先前调用所得的字符串。 修改
getenv
返回的字符串会引起未定义行为。2) 同 (1) ,除了将环境变量的值写入用户提供的缓冲区
value
(除非它为 NULL
),而且将写入的字节数存储于用户提供的位置 *len (除非它为 NULL
)。若环境变量未设置于环境中,则 *len 会被写入零(除非是 NULL
),且 '\0' 会被写入 value[0] (除非是 NULL
)。另外,在运行时检测下列错误并调用当前安装的制约处理函数
-
name
是空指针 -
valuesz
大于 RSIZE_MAX -
value
是空指针且valuesz
非零
-
- 同所有边界检查函数,
getenv_s
仅若实现定义 __STDC_LIB_EXT1__ 且用户在包含stdlib.h
前定义 __STDC_WANT_LIB_EXT1__ 为整数常量 1 才保证可用。
参数
name | - | 标识要查找的环境变量名称的空终止字符串 |
len | - | 指向用户提供的位置, getenv_s 将会在其中存储环境变量的长度
|
value | - | 指向用户提供的字符数组, getenv_s 将会在其中存储环境变量内容
|
valuesz | - | 允许 getenv_s 对目标写入的最大字节数(缓冲区大小)
|
返回值
1) 标识环境变量的值的字符串,若找不到该环境变量则为空指针。
2) 若找到环境变量则为零,若找不到该环境变量或发生运行时强制违规,则为非零。错误的情况下,将 *len 写入零(除非
len
为空指针)。注解
POSIX 系统上,亦可通过全局变量 environ
访问环境变量,它于 <unistd.h>
中声明为 extern char **environ; ,并可通过可选的 main
函数第三参数 envp
访问。
以空指针为 value
,以零为 valuesz
调用 getenv_s
,可用于确定保有整个结果所需的缓冲区大小。
示例
运行此代码
#include <stdio.h> #include <stdlib.h> int main(void) { const char *name = "PATH"; const char *env_p = getenv(name); if (env_p) printf("%s = %s\n", name, env_p); }
可能的输出:
PATH = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
引用
- C11 标准(ISO/IEC 9899:2011):
- 7.22.4.6 The getenv function (第 352-353 页)
- K.3.6.2.1 The getenv_s function (第 606-607 页)
- C99 标准(ISO/IEC 9899:1999):
- 7.20.4.5 The getenv function (第 317 页)
- C89/C90 标准(ISO/IEC 9899:1990):
- 4.10.4.4 The getenv function