循环中realloc()中的段错误

时间:2012-03-21 19:43:49

标签: c memory-management realloc

我正在尝试在每次循环调用时重新分配更多256个字节来缓冲。在此缓冲区中,我将存储从read()获得的缓冲区。

这是我的代码:

#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);

但是上面的代码返回了段错误。我哪里错了?

3 个答案:

答案 0 :(得分:2)

read不会添加0终结符。因此,你的内在while无疑会超出分配的记忆:

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

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

整个buffer分配内容看起来毫无用处,因为您实际上并未在任何地方使用它。

答案 1 :(得分:2)

这些问题对我来说很明显:

  • 您的realloc可以修改buffer分的位置。但是你没有相应地修改p,而是指向前一个缓冲区。这显然是一个错误。
  • 我发现另一个错误的可能性是while循环不需要终止并且可以在缓冲区的末尾运行。这是导致细分错误的最可能原因。
  • 您使用realloc的方式是错误的。如果对realloc的调用失败,则您不能再free原始缓冲区。您应该将realloc的返回值分配给临时变量,并在覆盖buffer变量之前检查错误。
  • 您不应在指针free上调用p。由于这意味着指向buffer所拥有的区块,因此您仅在free上致电buffer

答案 2 :(得分:2)

realloc上使用buffer时,由于更改大小,buffer的地址可能会发生变化。一旦发生这种情况,p将不再保留正确的地址。

最后,当pbuffer指向同一位置时,您可以释放{{1}}和{{1}}。你应该只释放其中一个。