c - 循环中 realloc() 中的段错误

标签 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);

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

最佳答案

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

  • 您的realloc 可以修改buffer 指向的位置。但是您未能相应地修改 p 并且它仍然指向前一个缓冲区。这显然是一个错误。
  • 我认为可能会出现另一个错误,因为 while 循环不需要终止并且可能会超出缓冲区的末尾。这是导致段错误的最可能原因。
  • 您使用realloc 的方式是错误的。如果对 realloc 的调用失败,那么您将无法再释放 原始缓冲区。您应该将 realloc 的返回值分配给一个临时变量,并在覆盖 buffer 变量之前检查错误。
  • 您不应该在指针 p 上调用 free。由于这意味着指向 buffer 拥有的 block ,因此您可以单独在 buffer 上调用 free

关于c - 循环中 realloc() 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9811728/

相关文章:

c - 为什么在我尝试分配新内存时 realloc 会使我的程序崩溃?

c++ - Windows中的管道句柄如何关闭? (_pclose() 的 fclose())?

c - Ubuntu/Windows 中的不同输出

c - 虚拟内存系统、页表和TLB

c - 重新分配内存拦截

c - 如何在 C 中为未知长度的字符串数组分配内存

c - 提供函数指针时取消引用指向不完整类型的指针

c - 如果我们不存储输入字符怎么办?

c++ - 在 C++11 中,如何调用 new 并为对象预留足够的内存?

c++ - 对象列表应该存储在堆上还是堆栈上?