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

从libc中的函数返回的字符串在哪里分配?,c,memory-leaks,libc,C,Memory Leaks,Libc,我开始了一些socket编程,并运行了inet_ntoa函数。该函数具有原型char*inet\u ntoa(struct in\u addr in) 那么如何/在哪里分配这个字符串呢?我需要免费打电话吗?不,你不需要免费。它通常是函数中的静态存储,如果在线程环境中运行,则是特定于线程的数据 发件人: inet\u ntoa()的返回值可能指向静态数据,这些数据可能会被后续调用inet\u ntoa()覆盖 该页还指出: inet_ntoa()函数不需要是可重入的。不要求可重入的函数不要求是线程

我开始了一些socket编程,并运行了inet_ntoa函数。该函数具有原型
char*inet\u ntoa(struct in\u addr in)


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

不,你不需要免费。它通常是函数中的静态存储,如果在线程环境中运行,则是特定于线程的数据

发件人:

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

该页还指出:

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

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

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

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

不,你不能释放它。它通常是函数中的静态存储,如果在线程环境中运行,则是特定于线程的数据

发件人:

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

该页还指出:

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

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

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

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

函数的作用是:将 中给定的Internet主机地址 网络字节顺序为中的字符串 标准数字和点符号。 字符串返回到一个静态分配的缓冲区,该缓冲区随后 呼叫将覆盖

所以,没有。

来自:

函数的作用是:将 中给定的Internet主机地址 网络字节顺序为中的字符串 标准数字和点符号。 字符串返回到一个静态分配的缓冲区,该缓冲区随后 呼叫将覆盖


所以,不需要。你不需要释放它,因为它是静态的


但是,在再次调用函数之前,必须复制字符串内容,否则将覆盖第一次调用的内容。

由于它是静态的,因此不需要释放它


但是,在再次调用函数之前,必须复制字符串内容,否则会覆盖第一次调用的内容。

(非常)简短的回答并不能真正回答您的问题:inset\u ntop是新标准。ntoa已被弃用。请参见(重复):在错误部分手册页的末尾:
inet\u ntoa()返回的字符串驻留在静态内存区域。
我认为寓意在于,在正式标准中,如果文档没有说明如何释放与返回值相关的任何内存,或者以其他方式说明它是如何分配的,那就意味着你不必释放它。就我个人而言,在编写函数文档时,我会尽量明确这一点,因为当我在同事的文档中看不到任何说明时,我就怀疑他们可能忘记了提及它。@Steve:如今,线程到处都是标准的,除了基本的C,甚至在即将推出的C1x标准中,函数的规范必须记录返回的缓冲区的存储,或者至少记录函数是非线程安全的(同样也是非库安全的)。(非常)简短的回答并不能真正回答您的问题:inset_ntop是新标准。ntoa已被弃用。请参见(重复):在错误部分手册页的末尾:
inet\u ntoa()返回的字符串驻留在静态内存区域。
我认为寓意在于,在正式标准中,如果文档没有说明如何释放与返回值相关的任何内存,或者以其他方式说明它是如何分配的,那就意味着你不必释放它。就我个人而言,在编写函数文档时,我会尽量明确这一点,因为当我在同事的文档中看不到任何说明时,我就怀疑他们可能忘记了提及它。@Steve:如今,线程到处都是标准的,除了基本的C,甚至在即将推出的C1x标准中,函数的规范必须记录返回的缓冲区的存储,或者至少记录函数是非线程安全的(同样也是非库安全的)。尽管请注意,此引用来自Linux手册页(因此可能与glibc有关),但问题链接到BSD手册页。Posix不能保证后续调用会覆盖相同的缓冲区,linux显然是这样做的,尽管您必须认为这是在任何*nix;-)上实现它的明显方式Posix确实说,“inet_ntoa()函数不需要是可重入的”,这是“允许(除其他外)返回指向静态缓冲区的指针”的标准用法。@Steve:虽然它没有说必须返回指向静态缓冲区的指针,这和返回一个指向
malloc
获取的缓冲区(其地址存储在静态变量中)的指针几乎是唯一可能的实现。我想在后一种情况下,它实际上可以使用线程局部变量来存储地址并使自己成为线程安全的,但从库代码使用它仍然不安全(在库代码中它会破坏调用方的状态)。@R..:的确如此。还允许使用各种“愚蠢”选项,例如返回指向静态缓冲池的LRU的指针。这将给图书馆安全带来有限的外观,但实际上并未实现。实际上,我只是指出linux比BSD记录了更多的实现,我并不打算暗示BSD主动保留做任何愚蠢事情的权利。我注意到linux说