C-免费使用Realloc



我试图在从插座读取时使用Realloc将内存分配为数组。.evrything工作正常,但是当我在main中使用免费时,它会出现错误。实际上,我需要在usr_data中获取数据并将其发送到其他功能以进行处理。

*** glibc detected *** free(): invalid next size (fast): 0x083fc008 ***
Aborted (core dumped)

这是功能:

int read_from_socket(int connfd,char **usr_str)
{
printf("nusr_data : %sn",*usr_str);
int count = 0, bytesread = 0;
char *temp;
char buf[MAX] = {0};
while((bytesread = read(connfd,buf,BLOCKSIZE))>0)
{
    temp = NULL;
    count = count + bytesread;
    temp = (char *)realloc(*usr_str, count);
    if(NULL == temp)
    {
        printf("nMemory Errorn");
        return FAILURE;
    }
    *usr_str = temp;
    printf("nadd in: %lu",*usr_str);
    memcpy(((*usr_str) + count - bytesread),buf, MAX);
    printf("nadd in2: %lu",*usr_str);
    if((*usr_str)[count-1] == '$')
    {
       (*usr_str)[count-1] = '';
       printf("nData received: %sn",*usr_str);
       printf("nadd in2: %lu",*usr_str);
       break;
    }
}
}

这是我在main

中使用的代码
for(;;)
{
printf("I am waiting-----Start of Main Loopn");
len=sizeof(cliaddr);
connfd=accept(sd,(struct sockaddr*)&cliaddr,&len);
if ( connfd < 0)
{
    if (errno == EINTR)
    printf("Interrupted system call ??");
    continue;
}
printf("Connection from %sn",inet_ntop(AF_INET,&cliaddr.sin_addr,buf,sizeof(buf)));
while(1)
{
    usr_data = NULL;
    read_from_socket(connfd,&usr_data);
    printf("nusr_dat: %s    %lun",usr_data,usr_data);
    if(!strcmp(usr_data,"exit"))
    {
        break;
    }
    printf("nadd: %lun",usr_data);
    free(usr_data);
}
close(connfd);
printf("nFINISHED SERVING ONE CLIENTn");
}

实际上,服务器一直在读取循环中运行,直到它从用户退出为止...

任何一个人都可以指出原因。

memcpy(((*usr_str) + count - bytesread),buf, bytesread);

应该这样做。如果 bytesread 小于 max 您的版本在分配的缓冲区的末尾

复制

在我看来,您已经在循环中使用了free()调用,并且一旦内存获得免费,就必须重新分配,然后才能再次使用free()调用。因此,此错误正在显示。尝试在循环外使用Free()。希望这会有所帮助。

相关内容

  • 没有找到相关文章

最新更新