2012-08-15 152 views
2

在C中,我正在阅读一个页面的html,但我希望持有数据的缓冲区是动态的。我知道我必须用循环和realloc来做到这一点,但我不太确定我会如何去做。假设我有我的插座(sock)已经打开考虑以下几点:RECV动态内存分配

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; 
} 

这将是对如何实现我的目标,我最好的猜测,但我很怀疑这会工作,我只是需要一些有识之士或更正。

+0

您可以使用'MSG_PEEK'标志参数来查看消息的实际大小,只需一次性分配,不需要'realloc'。 – Necrolis 2012-08-15 15:23:55

+0

不是有需要的,但你可以给我一些关于你如何做到这一点的示例代码?并感谢您的回答。这与学校无关,与个人兴趣相关。 – 2012-08-15 15:28:03

+0

@Necrolis:你能举个例子来更新我的代码吗?我不知道这样做。我缺少一些东西.'char缓冲区[128]; size = recv(sock,buffer,sizeof(buffer),MSG_PEEK);'sizeof(buffer)'总是小于或等于'size'。从不大于,对吗? – Jack 2012-08-20 18:08:02

回答

4

一些不良的错误代码:

c == recv(... 

==是一个比较,而不是分配,您将永远得到任何01。然后:

tmp = realloc(buffer, i * sizeof(char)); 

sizeof(char)1定义,你必须对NULL检查返回值。另外,给你的变量命名一些有意义的东西 - 以后会为你节省很多痛苦。

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

简单的解决方案(多个中的一个):

  • 分配缓冲区的前期,
  • 在累积尺寸的环保持轨道读入它(和由此的偏移量),
  • 如果用尽了缓冲区空间 - 重新分配到两倍于前一个的大小,并继续。

工作的时间TM最。如果对方不断向你提供数据,你可能需要添加一些理智检查,以免吞噬你所有的记忆。

希望这会有所帮助。

+0

对不起,我仅仅因为昨天遇到的一个问题而在这里标明了这一点,非常感谢您的帮助! – 2012-08-15 15:37:08