为什么当我重复调用30次时realloc()返回NULL?

问题描述 投票:-1回答:1

我想将两个缓冲区合并为一个

int BBB(char *dest,int sz,char *sour,int s_sz)
{
   if((dest=realloc(dest,sz+s_sz))==NULL)//
   {
       perror("realloc");
   }

   for (size_t i = 0; i < s_sz; i++)
   {
       *(dest + sz +i)=*(sour+i);
   }
   return sz+s_sz ;
}

上面的代码在组合小增益时效果很好,但是当我反复称该错误时>>

:malloc: *** error for object 0x7ff8cf009800: pointer being realloc'd was not allocated

已返回,调试信息

dest:0x0000000103008200 "HTTP/1.1 200 OK\r\nBdpagetype:...
sz:33792
s_sz:1024

下面是我的主要功能。

 do{
     r_n=recv(sfd,rbuff,BUFSIZ,0);
     BBB(rdata,nbuff,rbuff,BUFSIZ);
     memset(rbuff,0,BUFSIZ);
     nbuff+=BUFSIZ;
   } while (r_n);

感谢兄弟,所以我想知道如何解决它?

我想将两个缓冲区合并为一个int BBB(char * dest,int sz,char * sour,int s_sz){if((dest = realloc(dest,sz + s_sz))== NULL)// {perror (“重新分配”); } for(size_t i = 0; i <...>

使用给定的非空指针值成功调用realloc后,不允许继续使用传递给realloc的指针值。您需要改用realloc返回的值。

您正在将返回值从realloc分配给local

变量dest,因此在调用代码中,rdata将保持不变。

因此,取决于您最初是否将rdata设置为NULL,在第二个循环迭代中,rdata仍为NULL或无效。在前一种情况下,您的下一个realloc调用将创建一个新的不相关分配,而前一个调用将被泄漏;在后一种情况下,您通过将无效指针再次传递给realloc导致了不确定的行为。

此外,不能将realloc的返回值分配给传入的同一指针,因为这可能会导致内存泄漏。如果realloc由于任何原因失败,它将返回一个空指针,并且如果您将其分配给指向原始分配的唯一指针,那么您将没有任何办法来达到原始分配(在[[ C0]失败)。

c memory-management
1个回答
0
投票

使用给定的非空指针值成功调用realloc后,不允许继续使用传递给realloc的指针值。您需要改用realloc返回的值。

© www.soinside.com 2019 - 2024. All rights reserved.