C++ C++;inet_ntoa导致分段错误
函数的作用是:在下面的代码中产生分段错误。请告诉我,为什么。我该如何修复它?非常感谢C++ C++;inet_ntoa导致分段错误,c++,unix,g++,C++,Unix,G++,函数的作用是:在下面的代码中产生分段错误。请告诉我,为什么。我该如何修复它?非常感谢 void ClientAdd ( int clientSocket ) { sockaddr clientAddress; socklen_t clientAddressLength; sockaddr_in* clientAddressInternet; char* clientHost;
void ClientAdd ( int clientSocket )
{
sockaddr clientAddress;
socklen_t clientAddressLength;
sockaddr_in* clientAddressInternet;
char* clientHost;
getpeername ( clientSocket , &clientAddress , &clientAddressLength );
clientAddressInternet = (struct sockaddr_in*)&clientAddress;
clientHost = inet_ntoa ( clientAddressInternet->sin_addr );
};
我认为这一切都与inet_ntoa的返回值有关。但我不知道如何找到
使用g++@debian编译PS时,需要传递两个指向内存的指针,它可以在内存中写入客户端地址和客户端地址长度。那么您的原始代码是什么
sockaddr* clientAddress;
socklen_t* clientAddressLength;
getpeername ( clientSocket , clientAddress , clientAddressLength );
错误,因为两个指针clientAddress
和clientAddressLength
未初始化。这些指针将指向内存中的某个任意位置,如果不立即写入,很可能会导致程序崩溃。正确调用getpeername
最简单的方法是声明两个变量,而不是两个指针,然后使用运算符“&”的地址将这些变量的地址传递给getpeername
。像这样
sockaddr clientAddress;
socklen_t clientAddressLength;
getpeername ( clientSocket , &clientAddress , &clientAddressLength );
那是你真正的密码吗?还是你漏掉了一些?如果这是真正的代码,你就有真正的问题。我已经更新了代码。你能说得具体点吗?很明显你不懂指针。不能像这样使用
clientAddress
和clientAddress-length
指针。指针必须指向某个地方getpeername
需要指向某个对象的指针,而不是您给定的未初始化指针。我不是socket编程专家,但像这样的东西会更好<代码>sockaddr客户端地址;socklen_t clientaddress长度;getpeername(clientSocket、&clientAddress、&clientAddressLength)代码>。你可以这样看,我传递的指针实际上指向getpeername
。那么,有一堆指针似乎什么都没有指向?看起来你需要更少的“*”和更多的“&”,要么是那个,要么是一些malloc。最新的编辑看起来更好。现在可以用了吗?你仍然可以放弃这些演员,他们没有添加任何东西。只是getpeername(clientSocket,&clientAddress,&clientAddress长度)代码>更好了。谢谢你的帮助,贾哈吉!我想投你一票,但我还没有这个特权。。。