我正在尝试在每次循环调用时重新分配更多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);
但是上面的代码返回了段错误。我哪里错了?
答案 0 :(得分:2)
read
不会添加0终结符。因此,你的内在while
无疑会超出分配的记忆:
while(*tbuf) *p++ = *tbuf++;
另一个问题是你正在释放你没有通过malloc收到的东西。当您拨打免费电话时,您试图释放的p
和tbuff
都会增加。
整个buffer
分配内容看起来毫无用处,因为您实际上并未在任何地方使用它。
答案 1 :(得分:2)
这些问题对我来说很明显:
realloc
可以修改buffer
分的位置。但是你没有相应地修改p
,而是指向前一个缓冲区。这显然是一个错误。while
循环不需要终止并且可以在缓冲区的末尾运行。这是导致细分错误的最可能原因。realloc
的方式是错误的。如果对realloc
的调用失败,则您不能再free
原始缓冲区。您应该将realloc
的返回值分配给临时变量,并在覆盖buffer
变量之前检查错误。free
上调用p
。由于这意味着指向buffer
所拥有的区块,因此您仅在free
上致电buffer
。答案 2 :(得分:2)
在realloc
上使用buffer
时,由于更改大小,buffer
的地址可能会发生变化。一旦发生这种情况,p
将不再保留正确的地址。
最后,当p
和buffer
指向同一位置时,您可以释放{{1}}和{{1}}。你应该只释放其中一个。