malloc

时间:2015-09-18 05:40:26

标签: c++ char malloc

我有一个字符指针&使用了malloc之类的

 char *message;
 message=(char *)malloc(4000*sizeof(char));

稍后我从socket中接收数据如果数据超过4000字节会发生什么?

4 个答案:

答案 0 :(得分:1)

我会假设您在询问如果您这样做会发生什么:

recv(socket,message,5000,0);

并且读取的数据量大于4000。

这将是未定义的行为,因此您需要确保它不会发生。无论何时从套接字读取,您都应该能够指定要读取的最大字符数。

答案 1 :(得分:1)

您的问题遗漏了许多有关网络协议的详细信息,请参阅@DavidSchwartz的回答。

但是要专注于存储它的缓冲区:如果你尝试将超过4K字符写入message分配的内存,你的程序可能会崩溃。

如果您测试收到的邮件大小,可以执行realloc

int buf_len = 4000;
char *message;
message = static_cast<char*>(malloc(buf_len));

/* read message, and after you have read 4000 chars, do */
buf_len *= 2;
message = static_cast<char*>(realloc(message, buf_len));

/* rinse and repeat if buffer is still too small */

free(message); // don't forget to clean-up

但这是非常劳动密集型的。只需使用std::string

即可
int buf_len = 4000;
std::string message;
message.reserve(buf_len); // allocate 4K to save on repeated allocations
/* read message, std::string will automatically expand, no worries! */
// destructor will automatically clean-up! 

答案 2 :(得分:1)

这取决于几个因素。假设您的代码中没有错误,则取决于您使用的协议。

如果使用TCP,您将永远不会获得比您要求的更多的字节数。下次调用接收函数时,您将获得更多数据。

如果UDP,您可能会被截断,则可能会出现错误(如MSG_TRUNC)。这取决于您的平台的具体情况以及您如何调用接收功能。我知道没有平台可以为下次调用接收函数保存部分数据报。

当然,如果您的代码中存在错误并且您实际上溢出了缓冲区,则可能会发生非常糟糕的事情。因此,请确保仅将合理的值传递给您正在使用的任何接收函数。

答案 3 :(得分:0)

为获得最佳结果,您会收到分段错误错误

What is a segmentation fault? dangers of heap overflows?