glibc sprintf 可以在可重入函数中使用吗?

发布于 2024-10-10 13:47:31 字数 180 浏览 0 评论 0原文

如果 sprintf 在本地缓冲区中写入,我可以在可重入函数中使用它吗?像这样的事情:

void reentrant_function () { 
    int i = 4;
    char buffer[20];
    snprintf(buffer, 20, "%d", i); 
}

Can I use sprintf in a reentrant function if it writes in a local buffer? Something like this:

void reentrant_function () { 
    int i = 4;
    char buffer[20];
    snprintf(buffer, 20, "%d", i); 
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

雨夜星沙 2024-10-17 13:47:31

我进入此页面是因为我也在问同样的问题。以下是我从书中读到的内容:

UNIX 环境中的高级编程:第二版

第 10.6 节

图 10.4 中没有的大多数函数(可重入函数列表)都缺失了,因为 (a) 已知它们使用静态数据结构,(b) 它们调用 malloc 或 free,或者(c) 它们是标准 I/O 库的一部分。

Linux 编程接口

第 21.1.2 章

如果函数使用静态数据结构,那么它们也可以是不可重入的
内部簿记。此类函数最明显的例子是成员
stdio 库(printf()、scanf() 等),用于更新内部数据
缓冲 I/O 的结构。

我想这取决于实施。这还取决于您实际如何使用 snprintf(缓冲区是必不可少的)。这个问题最安全的答案应该是“不”。

I get to this page because I am also asking the same question. Here is what I read from books:

Advanced Programming in the UNIX Environment: Second Edition

Section 10.6

Most functions that are not in Figure 10.4 (a list of reentrant functions) are missing because (a) they are known to use static data structures, (b) they call malloc or free, or (c) they are part of the standard I/O library.

The Linux Programming Interface

Chapter 21.1.2

Functions can also be nonreentrant if they use static data structures for their
internal bookkeeping. The most obvious examples of such functions are the members
of the stdio library (printf(), scanf(), and so on), which update internal data
structures for buffered I/O.

I guess it is implementation depending. It also depends on how do you use snprintf actually (the buffer is essential). The safest answer to the question should be 'no'.

森林很绿却致人迷途 2024-10-17 13:47:31

当然可以,除非您的缓冲区是静态的。

Sure you can, unless your buffer is static.

柠檬心 2024-10-17 13:47:31

是的。

为什么你认为你不能?没有全球性的吧

想到一件事:缓冲区是函数的本地缓冲区,为什么要格式化字符串而不对其执行任何操作?

Yes.

Why do you think you could not? There's no global.

One thing thought: the buffer is local to the function, why would you want to format a string and do nothing with it?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文