我正在尝试使用realloc在从socket读取数据时将内存分配给数组.. evrything工作正常但是当我在main中使用free时它会出错。我实际上需要在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 : %s\n",*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 Error\n");
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] = '\0';
printf("\nData received: %s\n",*usr_str);
printf("\nadd in2: %lu",*usr_str);
break;
}
}
}
AND HERE是我在主要使用的代码
for(;;)
{
printf("I am waiting-----Start of Main Loop\n");
len=sizeof(cliaddr);
connfd=accept(sd,(struct sockaddr*)&cliaddr,&len);
if ( connfd < 0)
{
if (errno == EINTR)
printf("Interrupted system call ??");
continue;
}
printf("Connection from %s\n",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 %lu\n",usr_data,usr_data);
if(!strcmp(usr_data,"exit"))
{
break;
}
printf("\nadd: %lu\n",usr_data);
free(usr_data);
}
close(connfd);
printf("\nFINISHED SERVING ONE CLIENT\n");
}
实际上服务器在读取循环中继续运行,直到它从用户退出...
任何人都可以指出为什么.. glibc错误与free()
答案 0 :(得分:3)
memcpy(((*usr_str) + count - bytesread),buf, bytesread);
应该这样做。如果 bytesread 小于 MAX ,则您的版本副本超出分配的缓冲区的末尾
答案 1 :(得分:1)
在我看来,你已经在循环中使用了free()调用,一旦内存空闲,必须重新分配才能再次使用free()调用。 所以这个错误就出现了。 尝试在循环外使用free()。 希望这会有所帮助。