获取错误 C2440:char[]* 到 char*(指针)
Getting error C2440: char[]* to char* (pointers)
(明显的c++初学者,继续纠结指针)
我一直在尝试获取客户端的 IP 地址作为服务器(使用 TCP),并使用指针保存它以便以后能够重新使用它。
在之前的函数中,我接受了连接并将 Socket 保存为 m_clientSocket
并将 Socket 信息保存在名为 clientaddr
的 struct 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;
clientIPaddr
是 char[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
(明显的c++初学者,继续纠结指针)
我一直在尝试获取客户端的 IP 地址作为服务器(使用 TCP),并使用指针保存它以便以后能够重新使用它。
在之前的函数中,我接受了连接并将 Socket 保存为 m_clientSocket
并将 Socket 信息保存在名为 clientaddr
的 struct 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;
clientIPaddr
是 char[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