char FAR * inet_ntoa (
struct in_addr in
);
这个函数可以把IPv4地址数据转换为字符串的形式。
看着这个函数总觉得有些别扭,心想对于一般的Win32 API而言,返回字符串的形式应该是类似这个样子:
returntype SomeFunction(LPTSTR lpBuffer);
为了搞清楚它里面的秘密,我写了如下的代码进行测试:
struct in_addr ip;
ip.S_un.S_addr = 0x12345678;
char * str = inet_ntoa(ip);
MessageBox(NULL, str, "IP", 0);
ip.S_un.S_addr = 0x87654321;
inet_ntoa(ip);
MessageBox(NULL, str, "IP", 0);
执行的结果是str所指向的内存空间的内容改变了。如此看来,这个函数的实现应该是这个样子:
char FAR * inet_ntoa (struct in_addr in)
{
static char strRet[16];
// ...
return strRet;
}
老实说,我觉得这样的代码不够科学,对外部代码的耦合性不是很好,而且浪费内存。
struct in_addr in
);
这个函数可以把IPv4地址数据转换为字符串的形式。
看着这个函数总觉得有些别扭,心想对于一般的Win32 API而言,返回字符串的形式应该是类似这个样子:
returntype SomeFunction(LPTSTR lpBuffer);
为了搞清楚它里面的秘密,我写了如下的代码进行测试:
struct in_addr ip;
ip.S_un.S_addr = 0x12345678;
char * str = inet_ntoa(ip);
MessageBox(NULL, str, "IP", 0);
ip.S_un.S_addr = 0x87654321;
inet_ntoa(ip);
MessageBox(NULL, str, "IP", 0);
执行的结果是str所指向的内存空间的内容改变了。如此看来,这个函数的实现应该是这个样子:
char FAR * inet_ntoa (struct in_addr in)
{
static char strRet[16];
// ...
return strRet;
}
老实说,我觉得这样的代码不够科学,对外部代码的耦合性不是很好,而且浪费内存。
博客介绍了inet_ntoa函数可将IPv4地址数据转换为字符串形式。作者通过代码测试发现,该函数返回的字符串内存内容会改变,推测其实现使用了静态数组。作者认为这种实现不够科学,存在耦合性差和浪费内存的问题。

被折叠的 条评论
为什么被折叠?



