我正在尝试在每次循环调用时重新分配更多 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);
但是上面的代码返回段错误。我哪里错了?
最佳答案
这些是对我来说很明显的问题:
- 您的
realloc
可以修改buffer
指向的位置。但是您未能相应地修改p
并且它仍然指向前一个缓冲区。这显然是一个错误。 - 我认为可能会出现另一个错误,因为
while
循环不需要终止并且可能会超出缓冲区的末尾。这是导致段错误的最可能原因。 - 您使用
realloc
的方式是错误的。如果对realloc
的调用失败,那么您将无法再释放
原始缓冲区。您应该将realloc
的返回值分配给一个临时变量,并在覆盖buffer
变量之前检查错误。 - 您不应该在指针
p
上调用free
。由于这意味着指向buffer
拥有的 block ,因此您可以单独在buffer
上调用free
。
关于c - 循环中 realloc() 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9811728/