Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;inet_ntoa导致分段错误_C++_Unix_G++ - Fatal编程技术网

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长度)更好了。谢谢你的帮助,贾哈吉!我想投你一票,但我还没有这个特权。。。