libc 中的函数返回的字符串在哪里分配?

发布于 2024-10-22 12:39:17 字数 133 浏览 3 评论 0原文

我开始了一些套接字编程,并且遇到了函数 inet_ntoa 。该函数的原型为 char * inet_ntoa(struct in_addr in);

那么这个字符串将如何/在哪里分配呢?我应该免费打电话吗?

I started some socket programming, and I ran across the function inet_ntoa . The function has the prototype char * inet_ntoa(struct in_addr in);.

So how/where will this string be allocated? Am I expected to call free on it?

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

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

发布评论

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

评论(3

雨轻弹 2024-10-29 12:39:17

来自 inet_ntoa(3)

inet_ntoa() 函数将
给出的互联网主机地址
网络字节顺序到字符串
标准数字和点表示法。
该字符串在静态分配的缓冲区中返回,随后
调用将覆盖

所以,不。

From inet_ntoa(3):

The inet_ntoa() function converts the
Internet host address in given in
network byte order to a string in
standard numbers-and-dots notation.
The string is returned in a statically allocated buffer, which subsequent
calls will overwrite

So, no.

千柳 2024-10-29 12:39:17

不,你不释放它。它通常是函数内的静态存储,或者是线程特定的数据(如果您在线程环境中运行)。

来自权威的 POSIX 手册页

inet_ntoa() 的返回值可能指向静态数据,这些数据可能会被后续调用 inet_ntoa() 覆盖。

该页面还指出:

inet_ntoa() 函数不需要是可重入的。不需要可重入的函数不需要是线程安全的。

这意味着,即使在线程环境中,它也可能根本不是线程安全的。

换句话说,它可以实现如下:

char *inet_ntoa (struct in_addr xyz) {
    static char buff[50];
    // Do something with xyz to populate buff.
    return buff;
}

No, you don't free it. It's usually static storage within the function, or thread-specific data if you're running in a threaded environment.

From the definitive POSIX man page:

The return value of inet_ntoa() may point to static data that may be overwritten by subsequent calls to inet_ntoa().

That page also states:

The inet_ntoa() function need not be reentrant. A function that is not required to be reentrant is not required to be thread-safe.

That means that, even in a threaded environment, it may not be thread-safe at all.

In other words, it can be implemented something like:

char *inet_ntoa (struct in_addr xyz) {
    static char buff[50];
    // Do something with xyz to populate buff.
    return buff;
}
骑趴 2024-10-29 12:39:17

您不需要释放它,因为它是静态的。

但是,在再次调用该函数之前,您必须获取字符串内容的副本,否则您将覆盖第一次调用的内容。

You don't need to free it since it is static.

But you have to take a copy of the string contents before you call the function again, otherwise you'll overwrite the contents from the first call.

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