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

时间:2015-05-06 10:41:25

标签: c++ sockets pointers tcp-ip

(c ++中的明显初学者,继续与指针斗争)

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

在上一个函数中,我接受连接并将 Socket 保存为m_clientSocket,将Socket信息保存在名为clientaddr的 struct sockaddr 中。

现在,我希望下一个函数返回客户端套接字并保存源IP ,但程序会一直崩溃。

在最后一个版本中,我尝试使用指针但转换中存在错误,即使我的研究也无法修复。

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

功能代码

SOCKET CmTcpListener::getNewSocket(SOCKET *hSocket, char* ptrSourceIp) 
{
    cout << "Retreaving 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:\ work \ 2015 \ tcptransport \ cmtcplistener.cpp(112):错误C2440:'=':   无法从'char(*)[30]'转换为'char *'           指向的类型是无关的;转换需要reinterpret_cast,C风格的转换或函数式转换

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

2 个答案:

答案 0 :(得分:0)

您正在尝试将clientIPaddr的地址指定给char*。它的类型为char[30],因此获取地址会指向char数组,而不是指向char的指针。数组可以衰减到指针,所以只需直接指定它:

ptrSourceIp = clientIPaddr;

答案 1 :(得分:0)

罪魁祸首是

ptrSourceIp = &clientIPaddr;

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

ptrSourceIp = clientIPaddr;

但是,现在,你没有对ptrSourceIp做任何事情,在函数结束时它将保持不变,因为它像任何其他变量一样通过值传递。如果你想修改传递的指针ptrSourceIp,那么你需要传递一个指向它的指针(即指向指针指向char的指针),所以函数的原型应该是:

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

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

*ptrSourceIp = clientIpAddr; // now we modify it