Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.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:memcpy segfault与void*指针_C_Segmentation Fault_Malloc_Memcpy - Fatal编程技术网

C:memcpy segfault与void*指针

C:memcpy segfault与void*指针,c,segmentation-fault,malloc,memcpy,C,Segmentation Fault,Malloc,Memcpy,代码--主循环: int handleClient (struct clientData* clientData) { void* Buffer = malloc (INET_BUFFER_SIZE); <-- VOID* BUFFER FOR RECV() int listenSocket = clientData->listenSocket; struct sockaddr_in clientAddress = clientData->clientA

代码--主循环:

int handleClient (struct clientData* clientData)
{
    void* Buffer = malloc (INET_BUFFER_SIZE); <-- VOID* BUFFER FOR RECV()
    int listenSocket = clientData->listenSocket;
    struct sockaddr_in clientAddress = clientData->clientAddress;

    printf("Received connection from client %s:%d.\n", inet_ntoa(clientAddress.sin_addr), ntohs(clientAddress.sin_port));

while (1)
{
    int packetSize;
    if ((packetSize = recv(listenSocket, &Buffer, INET_BUFFER_SIZE, 0)) > 0)
    {
        if (packetSize == ECHO_SIZE)
        {
            handleEchoPacket(Buffer);
            continue;
        }

        if (packetSize == MESSAGE_SIZE) <---THIS IS TRIGGERED BECAUSE OF PACKET SIZE
        {
            handleMessagePacket(Buffer);
            continue;
        }
    }
}
int-handleClient(struct-clientData*clientData)
{
void*Buffer=malloc(INET\u Buffer\u SIZE);listenSocket;
clientAddress=clientData->clientAddress中的struct sockaddr_;
printf(“从客户端%s接收到连接:%d。\n”、inet\u ntoa(clientAddress.sin\u addr)、ntohs(clientAddress.sin\u port));
而(1)
{
国际包装尺寸;
如果((packetSize=recv(listenSocket和Buffer,INET\u Buffer\u SIZE,0))>0)
{
if(packetSize==回音大小)
{
手袋(缓冲器);
继续;
}

if(packetSize==消息大小)发生的情况如下:当您将
缓冲区的地址传递给
recv
时,接收到的数据被放置在分配给堆栈上的缓冲区地址的空间中。当您随后调用
handleMessagePacket
时,传递的地址不再有效:它已被
recv写入

从调用
recv
中删除与应可解决此问题:

if ((packetSize = recv(listenSocket, Buffer, INET_BUFFER_SIZE, 0)) > 0)
//                                  ^^ No ampersand

一般来说,这样的情况最好使用内存探查器(如valgrind)进行诊断。该工具会立即告诉您,
缓冲区写入的堆栈区域无效,并且随后将接收到的数据作为指针取消引用(现在导致SIGSEGV的问题)无效读取。

您需要使用
recv(listenSocket,Buffer,INET\u Buffer\u SIZE,0);
--在
缓冲区之前没有
&
。我10秒前就意识到了这一点。这让我忙了一段时间。小步。谢谢您的回复!
Program received signal SIGSEGV, Segmentation fault.
__memcpy_sse2_unaligned () (.....) <--Tells me it doesn't have source files, not relevant to the problem.
if ((packetSize = recv(listenSocket, Buffer, INET_BUFFER_SIZE, 0)) > 0)
//                                  ^^ No ampersand