2012-03-21 127 views
0

我想重新分配更多的256字节缓冲区在每个循环调用。在这个缓冲区中,我将存储从read()获得的缓冲区。realloc()循环中的段错误

这里是我的代码:

#define MAX_BUFFER_SIZE 256 
//.... 
int sockfd = socket(...); 

char *buffer; 
buffer = malloc(MAX_BUFFER_SIZE); 
assert(NULL != buffer); 
char *tbuf = malloc(MAX_BUFFER_SIZE); 
char *p = buffer; 
int size = MAX_BUFFER_SIZE; 

while(read(sockfd, tbuf, MAX_BUFFER_SIZE) > 0) { 
    while(*tbuf) *p++ = *tbuf++; 
    size = size + MAX_BUFFER_SIZE; // it is the right size for it? 
    buffer = realloc(buffer, size); 
    assert(NULL != buffer); 
} 


printf("%s", buffer); 
free(tbuf); 
free(p); 
free(buffer); 
close(sockfd); 

但上面的代码返回段故障。我错在哪里?任何帮助非常感谢。提前致谢。

+2

'while(* tbuf)* p ++ = * tbuf ++;'您正在增加tBuf,它是malloc(0)d。你永远无法释放它,因为你失去了原来的指针。提示:使用'memcpy(p,tbuf,return_from_read);'while(* tbuf)'假设一个nul结尾的字符串。 – wildplasser 2012-03-21 19:49:36

回答

2

这些是对我来说是显而易见的问题:

  • realloc可以修改位置,它是buffer点。但是,您无法相应地修改p,并且它将指向上一个缓冲区。这显然是一个错误。
  • 我看到潜在的另一个错误,因为while循环不需要终止,并可能运行缓冲区的末尾。这是分段错误的最可能原因。
  • 您使用realloc的方式是错误的。如果realloc的调用失败,则不能再使用原始缓冲区的free。您应该将返回值realloc分配给一个临时变量并在覆盖buffer变量之前检查错误。
  • 您不应该在指针p上拨打free。由于这是为了指向buffer所拥有的区块,您只需拨打buffer即可拨打free
2

事情是read不添加0终止符。所以,你的内心while无疑是步进分配的内存外:

while(*tbuf) *p++ = *tbuf++; 

的另一个问题是,你是释放您没有通过的malloc得到的东西。当你免费打电话时,你会增加ptbuff你试图释放。

整个buffer分配的东西看起来没用,因为你实际上并没有在任何地方使用它。

2

当您使用reallocbuffer,有可能的buffer地址改变为改变大小的结果。一旦发生这种情况,p不再保存正确的地址。

同样在最后,当他们指向相同的位置时,您可以释放pbuffer。你只应该释放其中一个。