`./px&#39 ;: free()出错:下一个大小无效(正常)Aborted(core dumped)

时间:2016-03-27 17:14:04

标签: c sockets pointers memory realloc

你好我在很多讨论中寻找解决方案,不幸的是没有得到任何帮助。

我有一个代理服务器从一个客户端接收请求并要求服务器响应,我遵循的步骤是:

1 - > 我向客户提出了代理请求。

2 - > 代理连接到服务器并向客户端发送响应(直到此处一切正常)。

3 - > 当我从同一客户端向代理发出第二个请求时,当代理尝试再次连接到服务器时,会发生此错误:

  

*`./px':free()出错:下一个大小无效(正常):0x0000000001941120已中止(核心转储)*

这是发生错误的方法:

char * readResponseFromServer(char *hostname,char *request,char *response){
int sock;
struct sockaddr_in serv_addr;
struct hostent * server;

sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock<0)
    printEror("socket opening error");

server=gethostbyname(hostname);

if (server == NULL)
      printEror ("unknown host");
printf("the server adress is  %s\n",server->h_name);

bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
    bcopy((char *)server->h_addr, 
     (char *)&serv_addr.sin_addr.s_addr,
     server->h_length);
serv_addr.sin_port = htons(80);


if(connect(sock,(struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
     {
            printEror("connection error");

    }
int n1 = write(sock,request,strlen(request));
if (n1< 0) 
        printEror("ERROR writing to socket");
//reading response from server
int readed=0;
int bytesloaded=0;
int buf_size=512;
//we try to read 256 bytes each time
while( (readed = read(sock, response+ bytesloaded, buf_size)) > 0 )
    {   

    if(bytesloaded + readed >= buf_size)//the response buffer is full , so we allocate more memory
    {
        buf_size = buf_size + 256;  
        response = (char *)realloc(response, buf_size);

    }
    bytesloaded += readed;
    }

printf("the response is: %s",response);
close(sock);

}

特别是在这个电话中:

    server=gethostbyname(hostname);

总结一下,当我按上述方法调用上述方法时,我会收到此错误。

为什么我会收到此错误?

非常感谢。

解决方案:

我使用了不同的建议来解决我的问题,我再次感谢你。

主要问题是:

  1. 使用free()方法解除内存问题。
  2. 重新分配内存的坏方法。
  3. 并且错误不在我发布的Methode中,但是在另一种方法中,尽管程序在其他地方停止,所以我从这个问题中学到了一件事:内存错误可能来自程序中的任何地方。

    所以我不得不检查我的程序,并设法找出错误记忆的位置。

1 个答案:

答案 0 :(得分:1)

  
      
  • `./px' ;: free()出错:下一个大小无效(正常):0x0000000001941120已中止(核心转储)*
  •   

在您的代码中,假设以下原型中使用的char *request变量的内存:

char * readResponseFromServer(char *hostname,char *request,char *response){
提供

并从调用函数中释放...
...然后,如果要求在被调用函数中更改缓冲区的内存,则调用者必须传递地址变量,而不是变量本身。通过这种方式,realloc()可以在被调用函数中使用,同时提供调用者释放内存的能力。以下是使用realloc()显示其工作原理的代码段:

void growBuffer(char ** b, int *size);//note prototype include char **, not char *

int main(void) 
{ 
    char *buf = {0};
    buf = calloc(20,1);
    strcpy(buf, "original string-");
    int len = strlen(buf)+1;
    printf("Original buf and length: %s - %d\n", buf, len);
    growBuffer(&buf, &len);//caller passes address of buf: (&buf) 
    printf("New buf and length: %s - %d\n", buf, len);
    free(buf);//caller can now safely free memory

    return 0;
}



void growBuffer(char **buffer, int *size)
{
    const char newContent[]={"new content requires growing buffer"};

    int newlen = *size + strlen(newContent) + 1;

    char *buf = realloc((*buffer), newlen );
    if(buf)//always test return of [m][c][re]alloc before using
    {
        (*buffer) = buf; //assign new memory to buffer
        strcat((*buffer), newContent);//modify string
        *size = newlen;//pass back new len of string
    }
}