我开始了一些套接字编程,然后遇到了 inet_ntoa 函数。该函数具有原型char * inet_ntoa(struct in_addr in);
。
那么这个字符串将如何/在哪里分配?我应该免费打电话吗?
我开始了一些套接字编程,然后遇到了 inet_ntoa 函数。该函数具有原型char * inet_ntoa(struct in_addr in);
。
那么这个字符串将如何/在哪里分配?我应该免费打电话吗?
来自inet_ntoa(3)
:
inet_ntoa() 函数将网络字节顺序中给定的 Internet 主机地址转换为标准数字和点表示法的字符串。字符串在静态分配的缓冲区中返回,后续调用将覆盖该缓冲区
所以不行。
不,你不释放它。它通常是函数内的静态存储,或者如果您在线程环境中运行,则它是特定于线程的数据。
的返回值
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;
}
你不需要释放它,因为它是静态的。
但是您必须在再次调用该函数之前获取字符串内容的副本,否则您将覆盖第一次调用的内容。