c - 为什么动态分配的数组不会随着新数据的到来而更新?

标签 c sockets pointers

我正在尝试从套接字服务器接收消息,该服务器发送大约 7MB 的大文件。因此,在下面的代码中,我尝试将 buffer 中的所有数据连接到一个数组 s 中。但当我尝试以下操作时,我发现 s 的长度根本没有改变,尽管接收到的总字节数继续增加。

char buffer[300];
char* s = calloc(1, sizeof(char));
size_t n = 1;
while ((b_recv = recv(socket_fd,
                              buffer,
                              sizeof(buffer), 0)) > 0) {


   char *temp = realloc(s, b_recv + n);
   s = temp;
   memcpy(s + n -1, buffer, b_recv);
   n += b_recv;
   s[n-1] = '\0';
   printf("%s -- %zu",s, strlen(s));

}

free(s);

这不是更新不同大小的接收数据的正确方法吗?另外,当我尝试打印 s 时,它会给出一些随机的问号字符。我犯了什么错误?

最佳答案

Why does dynamically allocated array does not update with the new data coming?

您没有提出任何理由相信该行为正如问题所描述的那样。您正在接收二进制数据并将其存储在内存中,这很好,但是您不能指望将此类数据视为 C 字符串来处理会得到合理的结果。即使用字符串终止符替换最后一个字节也不会。

二进制数据通常可以包含值为 0 的字节。C 字符串使用此类字节作为标记字符串数据结尾的终止符,因此,例如,strlen 将仅测量字节数在第一个零字节之前,无论其后存储了多少附加字节。此外,即使您根本没有收到任何零字节,您的特定代码也会插入它们,从而破坏收到的一些实际字节。

您可能会尝试将此类数据像文本一样打印到控制台,但如果实际上它不包含根据运行时字符编码编码的文本,则没有理由期望结果显示能够传达有用的信息。相反,通过调试器在内存中检查它,或者将原始字节写入文件并使用十六进制编辑器检查结果,或者通过转换为十六进制或其他文本表示形式或类似的过滤器写入它们(仍然是原始的)。您需要检查的字节数与复制到分配空间的字节数一样多。您已经在跟踪它,因此您不需要 strlen() 来告诉您有多少。

关于c - 为什么动态分配的数组不会随着新数据的到来而更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60019407/

相关文章:

linux - 如何确定用户空间进程是否连接到netlink内核模块?

c# - 向现有系统类添加对象

c++ - DLL 互操作/有趣的错误

c - 尝试通过结构从动态字符串数组打印字符串时出错

c - 添加元素时链接列表出现段错误

c++ - vector 异常处理程序和 Microsoft C 运行时错误处理

c - C 中的字符串加密

c - 链接列表未显示节点,请检查代码

c - 引用结构属性时出现段错误(核心已转储)

java - 套接字 channel 始终为空