errno_t _dupenv_s(
char **buffer,
size_t *sizeInBytes,
const char *varname
);
我有几个问题:
- 为什么需要指向指针 (
**
) 的指针而不是指针 (*
)? - 为什么
sizeInBytes
是必需的,strlen(buffer)
不可用吗?
最佳答案
msvc 下任何以_s
为后缀的函数都是安全函数,这意味着它不会对传递的数据的完整性做出任何假设。正是出于这个原因,字符串的长度是必需的,因为您不能假设它以 null 终止或根本终止(您可能也只想要一半的字符串,但这是副作用)。
安全函数都返回错误代码,这样就可以在没有错误可能性的情况下进行检查,因此任何返回都需要通过指针发送。看到非安全版本的 strdup
和 dupenv
返回一个 char*
,你得到一个双重间接寻址,这样指向变量的指针你通过获取分配缓冲区的地址。
关于c - 为什么这个 MSVC API 是这样定义的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6165875/