gpt4 book ai didi

c - socket C 的动态内存分配

转载 作者:行者123 更新时间:2023-12-01 12:42:36 25 4
gpt4 key购买 nike

我想从套接字中保留动态内存。响应的大小是可变的,所以我想使用 realloc 来分配适当的内存大小。

这是处理它的代码片段:

char *ptr = (char*)calloc(sizeof(char),1024);
char *ptr2 = (char*)calloc(sizeof(char),1024);
//printf("aaaaaaa %p bbbbbbbb",ptr);
int nDataLength;
int i = 0;
while ((nDataLength = recv(Socket, ptr, 1024, 0)) > 0){

if (i > 0){//prepare in case that the response is bigger than 1024 bytes
printf("Data len: %d\n", nDataLength);
printf("%p points toa %d len: %d\n", ptr, *ptr, ((1024 * i) + nDataLength));
ptr2 = (char*)realloc(ptr2,((1024*i)+nDataLength));
printf("%p pints toa %d\n", ptr2, *ptr2);
system("pause");
memcpy(ptr2, ptr, nDataLength);
}
memcpy(ptr2, ptr, nDataLength);
i++;
}

问题是我从套接字接收到的缓冲区总是被 memcpy 到同一个地址,所以我覆盖了以前的缓冲区。我怎样才能移动 ptr2 不覆盖以前的存储缓冲区?它必须是这样的:

memcpy(ptr2+((1024 * i), ptr, nDataLength); 但它不起作用。

谢谢

最佳答案

首先:

  1. Please don't cast the return value of calloc() in C. Or malloc() .
  2. 不要使用 sizeof (char) 来“缩放”分配,它总是只有 1,所以没有意义。
  3. 如果您要将 recv() 写入内存,则无需使用 calloc()

您的问题是您一直将 recv() 传递给不断增长的缓冲区的开始,而不是下一个要存储的空闲位置 .您应该将 put + nTotalLength 作为 recv() 的目标,然后在每次成功接收后执行 nTotalLength += nDataLength

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

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