c - 为什么这个 MSVC API 是这样定义的?

标签 c windows

errno_t _dupenv_s(
   char **buffer,
   size_t *sizeInBytes,
   const char *varname
);

我有几个问题:

  1. 为什么需要指向指针 (**) 的指针而不是指针 (*)?
  2. 为什么 sizeInBytes 是必需的,strlen(buffer) 不可用吗?

最佳答案

msvc 下任何以_s 为后缀的函数都是安全函数,这意味着它不会对传递的数据的完整性做出任何假设。正是出于这个原因,字符串的长度是必需的,因为您不能假设它以 null 终止或根本终止(您可能也只想要一半的字符串,但这是副作用)。

安全函数都返回错误代码,这样就可以在没有错误可能性的情况下进行检查,因此任何返回都需要通过指针发送。看到非安全版本的 strdupdupenv 返回一个 char*,你得到一个双重间接寻址,这样指向变量的指针你通过获取分配缓冲区的地址。

关于c - 为什么这个 MSVC API 是这样定义的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6165875/

相关文章:

java - 打印 RTF 文件(带对话框)

c - 快速排序分区

c - 通过设备驱动程序访问 AXIS FIFO 寄存器时出现未处理的故障

windows - polymer 测试在 Windows 机器上永无止境

java - 如果 BufferedWriter 仍然打开,为什么 BufferedReader 会失败?

C#,将数据库值转换为字符串?

c++ - static 关键字会影响作用域吗?

c - 寻找简单算法的大 O

c - 提示可能的变量值/范围的C编译器(GCC或Clang)

php - Nginx 和 PHP-FPM - 权限被拒绝 - Windows