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

时间:2011-03-16 11:36:59

标签: c memory-leaks libc

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

那么这个字符串将如何/在哪里分配?我希望免费通话吗?

3 个答案:

答案 0 :(得分:3)

来自inet_ntoa(3)

  

inet_ntoa()函数转换   给定的Internet主机地址   网络字节顺序为一个字符串   标准数字和点符号。   该字符串在静态分配的缓冲区中返回,后续   电话会覆盖

所以,没有。

答案 1 :(得分:2)

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

来自the definitive POSIX man page

  

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;
}

答案 2 :(得分:1)

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

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