获取错误 C2440:char[]* 到 char*(指针)

Getting error C2440: char[]* to char* (pointers)

(明显的c++初学者,继续纠结指针)

我一直在尝试获取客户端的 IP 地址作为服务器(使用 TCP),并使用指针保存它以便以后能够重新使用它。

在之前的函数中,我接受了连接并将 Socket 保存为 m_clientSocket 并将 Socket 信息保存在名为 clientaddrstruct sockaddr 中].

现在,我想要下一个函数 return 客户端套接字 并保存 源 IP ,但是程序一直崩溃。

在最后一个版本中,我尝试使用指针,但转换时出现错误,尽管我进行了研究,但仍无法修复。

char clientIPaddr[30];
sockaddr_in clientaddr;
SOCKET m_clientSocket;

功能代码

SOCKET CmTcpListener::getNewSocket(SOCKET *hSocket, char* ptrSourceIp) 
{
    cout << "Retrieving socket..." << endl;
    if (m_newClientConnection)
    {
        hSocket = &m_clientSocket;

        strcpy(clientIPaddr, inet_ntoa(clientaddr.sin_addr));

        ptrSourceIp = &clientIPaddr;

        cout << "Socket : OK" << endl;

        return *hSocket;
    }
    else {
        cout << "No new client connection." << endl;
        return false;
    }

}

错误

c:\work15\tcptransport\cmtcplistener.cpp(112) : error C2440: '=' : cannot convert from 'char (*)[30]' to 'char *' Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast

我假设其余代码不是必需的,但如果需要我会很快提供它

您正试图将 clientIPaddr 的地址分配给 char*。它是 char[30] 类型,因此获取地址会得到指向 char 数组的指针,而不是指向 char 的指针。数组可以衰减为指针,直接赋值即可:

ptrSourceIp = clientIPaddr;

罪魁祸首是线

ptrSourceIp = &clientIPaddr;

clientIPaddrchar[30] 类型,所以 &clientIPaddr 的类型是 char(*)[30],即指向 30 个字符数组的指针。删除 & 就可以了,因为数组的名称本身就是指向其第一个元素的指针(从技术上讲,数组会衰减为指针)

ptrSourceIp = clientIPaddr;

但是,现在,您没有对 ptrSourceIp 执行任何操作,函数末尾将保持不变,因为它像任何其他变量一样按值传递。如果你想修改传递的指针ptrSourceIp,那么你需要传递一个指向它的指针(即一个pointer-to-pointer-to-char),所以你的函数原型应该是:

SOCKET CmTcpListener::getNewSocket(SOCKET *hSocket, char** ptrSourceIp) 

您传递的第二个参数必须是 &your_passed_ptr_to_char。在您的函数中,您现在可以修改传递的指针,如

*ptrSourceIp = clientIpAddr; // now we modify it