char数组与char指针

fre*_*oma 6 c malloc c-strings memset

当使用recv通过套接字接收数据时,我注意到了:

char buffer[4];
memset(buffer, 0, 4);
recv(socket, buffer, 4, 0);

我收到

mesgx

"mesg"是我发送的内容,附加了一些随机字符.

如果我使用

char * method = (char *) malloc(4);
memset(buffer, 0, 4);
recv(socket, buffer, 4, 0);

相反,我收到了

MESG

所以我的字符串中没有附加的随机内容.我想出如果我使用char [5]而不是它也可以,但我真的不明白为什么.malloc(4)真的分配了5个字节,第五个是NUL吗?

Gre*_*ill 16

调用malloc(4)真的只分配了四个字节.只是巧合,内存中的下一个字节恰好是NUL,它终止了你的字符串.

在你char buffer[4]在堆栈上分配的情况下,下一个字节恰好是'x'其他一些东西,所以你的字符串只是继续,直到找到下一个NUL字节.

套接字函数仅处理字节,并且不将字节视为具有尾随NUL的字符串或任何额外的字符串.你得到了你所要求的.


Dir*_*tel 6

您需要5个字符才能正确地终止NULL.终止NULL计为1,因此如果我们需要N个字符,则分配N + 1.或者相反,对于N的分配,您的N-1可用于您的内容.