char* getIP() { char* hostIP = (char*)malloc(sizeof(char) * 16); char hostName[256]; struct hostent* hostEntry; hostEntry = gethostbyname(hostName); if (hostEntry != NULL && hostEntry->h_addr_list[2] != NULL) { hostIP = inet_ntoa(*(struct in_addr*)hostEntry->h_addr_list[2]); } return hostIP; }返回值为乱码,请改进代码
时间: 2023-12-03 19:47:02 浏览: 64
这个函数中,`hostName` 变量没有被初始化,导致 `gethostbyname` 函数无法正常工作。此外,也没有检查函数的返回值是否为空指针,这可能导致访问非法内存,导致程序崩溃或返回错误的结果。以下是改进后的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <arpa/inet.h>
char* getIP() {
char* hostIP = NULL;
char hostName[256];
struct hostent* hostEntry;
if (gethostname(hostName, sizeof(hostName)) != 0) {
perror("gethostname");
return NULL;
}
hostEntry = gethostbyname(hostName);
if (hostEntry == NULL) {
herror("gethostbyname");
return NULL;
}
// 获取第一个 IP 地址
struct in_addr **addr_list = (struct in_addr **)hostEntry->h_addr_list;
if (addr_list[0] != NULL) {
hostIP = strdup(inet_ntoa(*addr_list[0]));
// 注意:strdup 函数会分配内存,需要在使用完后手动释放
// 或者可以使用 malloc 和 strcpy 来分配和复制字符串
}
return hostIP;
}
```
在这个改进版的代码中,我们先调用 `gethostname` 函数获取当前主机的名称,并将其存储在 `hostName` 变量中。如果该函数调用失败,则打印出错误信息并返回 NULL。
然后,我们调用 `gethostbyname` 函数获取主机的 IP 地址。如果该函数调用失败,则打印出错误信息并返回 NULL。
最后,我们从 `hostEntry` 结构体中获取 IP 地址列表,并返回第一个 IP 地址。注意,我们使用 `strdup` 函数来复制 IP 地址字符串,因为函数的使用者可能需要在使用完后手动释放内存。如果我们使用 `malloc` 和 `strcpy` 来复制字符串,则需要在使用完后手动释放内存。
希望这个改进版的代码能够解决你的问题。
阅读全文