如果 sprintf 写入本地缓冲区,我可以在可重入函数中使用它吗?像这样的东西:
void reentrant_function () {
int i = 4;
char buffer[20];
snprintf(buffer, 20, "%d", i);
}
我访问此页面是因为我也在问同样的问题。这是我从书上读到的:
UNIX 环境中的高级编程:第二版
第 10.6 节
图 10.4 中没有的大多数函数(可重入函数列表) 都缺失,因为 (a) 它们已知使用静态数据结构,(b) 它们调用 malloc 或 free,或者 (c) 它们是标准 I/O 库。
Linux 编程接口
第 21.1.2 章
如果函数使用静态数据结构,那么它们也可以是不可重入的 内部簿记。此类函数最明显的例子是成员 stdio 库(printf()、scanf() 等),用于更新内部数据 缓冲 I/O 的结构。
我想这取决于实施。这还取决于您实际如何使用 snprintf(缓冲区是必不可少的)。这个问题最安全的答案应该是“不”。
当然可以,除非您的
buffer
是 static
。
是的。
为什么你认为你不能?没有全球性的。
想到一件事:缓冲区是函数的本地缓冲区,为什么要格式化字符串而不对其执行任何操作?
手册页说它是“MT安全区域设置”,这意味着“在其他线程存在的情况下调用是安全的”,除了它从区域设置对象中读取而没有任何形式的同步,因此不安全与任何区域设置更改同时调用。