gpt4 book ai didi

c - RECV 动态内存分配

转载 作者:行者123 更新时间:2023-12-03 11:51:18 25 4
gpt4 key购买 nike

在 C 中,我希望读取页面的 html,但我希望保存数据的缓冲区是动态的。我知道我必须通过循环和使用 realloc 来执行此操作但我不太确定我将如何去做。假设我的套接字( sock )已经打开,请考虑以下内容:

char *buffer = ???, *tmp;  //just my guess I'm fairly certain buffer cannot be NULL considering my recv loop...
int q = 0, c;
int i = 1; //buffer size

while(q < i)
{
c == recv(sock, buffer + q, i - q, 0);
if(c == SOCKET_ERROR) break;
i += c;
tmp = realloc(buffer, i * sizeof(char));
//if(!tmp) /*not important right now I can add error handling later*/;
buffer = tmp;
q += c;
}

这将是我对如何实现目标的最佳猜测,但我非常怀疑这会奏效,我只需要一些见解或纠正。

最佳答案

代码中的一些严重错误:

c == recv(...
==是比较,而不是赋值,你会得到 01 .然后:
tmp = realloc(buffer, i * sizeof(char));
sizeof(char)1根据定义,您必须根据 NULL 检查返回值.此外,将变量命名为有意义的名称 - 以后会为您节省很多痛苦。

现在,您正在尝试执行诸如“后分配”之类的操作-读入缓冲区,然后将其扩展到您刚刚获得的大小-有点倒退。

简单的解决方案(众多之一):
  • 预先分配缓冲区,
  • 在循环中读入它,跟踪累积的大小(以及偏移量),
  • 如果缓冲区空间不足 - 将其重新分配给 两倍大小 上一个,然后继续。

  • 这在大部分时间都有效。如果对方不断向您提供数据,您可能需要添加一些健全性检查,以免吞噬您的所有内存。

    希望这可以帮助。

    关于c - RECV 动态内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11972157/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com