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

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

本文关键字:char 指针 取错误 C2440 获取      更新时间:2023-10-16

(C 中的显而易见的初学者,不断与指针斗争)

我一直在尝试将客户端的IP地址作为服务器(使用TCP),并使用指针将其保存以稍后再使用。

在以前的功能中,我接受连接,然后将套接字保存为m_clientSocket,而struct sockaddr中的套接字信息称为clientaddr

现在,我希望下一个函数返回客户端套接字并保存源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: work 2015 tcptransport cmtcplistener.cpp(112):错误c2440:'=':不能从" char( *)[30]'转换为'char *'指向的类型是无关的;转换需要Reinterpret_cast,C风格铸造或功能风格的铸造

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

罪魁祸首是行

ptrSourceIp = &clientIPaddr;

clientIPaddrchar[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 

您正在尝试将clientIPaddr的地址分配给char*。它是char[30]类型的,因此地址给出了char数组的指针,而不是指向char的指针。数组可以腐烂到指针,因此直接分配它:

ptrSourceIp = clientIPaddr;