如果我调用函数inet_ntoa返回char*.谁负责释放分配的内存?
我的方法看起来像这样:
char* inet_aton_(unsigned int atonIp){
in_addr sin_addr;
sin_addr.s_addr = atonIp;
return inet_ntoa(sin_addr);
}
Run Code Online (Sandbox Code Playgroud)
您应该查看手册.
$ man inet_ntoa
... inet_ntoa()函数将以网络字节顺序给出的Internet主机地址转换为IPv4点分十进制表示法中的字符串.该字符串在静态分配的缓冲区中返回,后续调用将覆盖该缓冲区.
这意味着在您的应用程序中,您将拥有一个静态分配的缓冲区,并且您负责其中的内容.每次调用应用程序中的inet_ntoa()都将覆盖此区域.如果需要保留两个地址,则必须将此数据复制到另一个缓冲区.您还负责在线程应用程序中以正确的方式使用,例如,如果您有两个线程同时调用inet_ntoa,您将得到错误的结果,或者对具有不同参数的inet_ntoa进行两次单独调用将返回相同的结果.
当你遇到这类问题时,你也应该查看源代码.例如,如果您搜索"inet_ntoa source".你可能会遇到一些例子; freebsd或ms.下面是一个示例实现(来自freebsd).
char *
inet_ntoa(struct in_addr ina)
{
static char buf[4*sizeof "123"];
unsigned char *ucp = (unsigned char *)&ina;
sprintf(buf, "%d.%d.%d.%d",
ucp[0] & 0xff,
ucp[1] & 0xff,
ucp[2] & 0xff,
ucp[3] & 0xff);
return buf;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,它具有仅为此目的分配的静态缓冲区.这使得inet_ntoa的使用非常简单,因为您不需要管理缓冲区,但也使它不是线程安全的.
另一件事,inet_ntoa不是系统调用.它可以被称为inet库提供的便利功能.
| 归档时间: |
|
| 查看次数: |
1387 次 |
| 最近记录: |