7

浏览 GNU C 库的源代码,我发现 inet_ntoa 是用

static __thread char buffer[18]

我的问题是,既然需要使用可重入的inet_ntoa,为什么GNU C库的作者不使用malloc来实现呢?

谢谢。

4

1 回答 1

19

它不使用堆的原因是为了符合标准(POSIX)和其他系统。该接口不是这样的,您应该释放返回的缓冲区。它假定静态存储..

但是通过将其声明为线程本地(使用__thread),如果两个线程碰巧都在调用该函数,则它们不会相互冲突。这是 glibc 针对接口损坏的解决方法。

确实,这不是可重入的,也不符合该术语的精神。如果您有调用它的递归函数,则不能依赖调用之间的缓冲区相同。但它可以被多个线程使用,这通常已经足够了。

编辑:顺便说一句,我只记得,这个函数有一个更新版本,它使用调用者提供的缓冲区。见inet_ntop()

于 2009-11-10T06:00:55.493 回答