You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新手疑问:winsock.h中recv函数为何接受数组名作为buf参数?

关于Winsock recv函数传入数组的疑问解答

你这里的核心困惑是C/C++中数组名的隐式转换规则,具体来说:

在C/C++里,当你把数组名(比如代码里的buff)作为函数参数传递时,它会自动被转换成指向数组首元素的指针。也就是说,buff等价于&buff[0]——后者就是你理解的“缓冲区的地址”,完全符合recv函数第二个参数char* buf的要求。

recv函数需要的是一个可写入的内存地址,它通过这个指针直接操作对应的内存区域(也就是你的buff数组所在的内存),所以能把接收到的数据写入数组里。这不是按值传递数组,而是传递了指针的值(数组首元素的地址),函数通过这个指针可以修改指向的内存内容,这也是为什么缓冲区能被正确填充的原因。

举个简单的例子,下面两行代码的效果完全一样:

bytes = recv(new_wsocket, buff, BUFFER_SIZE, 0);
bytes = recv(new_wsocket, &buff[0], BUFFER_SIZE, 0);

另外补充一点:你定义的char buff[30720]是栈上的数组,它的内存是可写的,这也满足recv对输出缓冲区的要求——需要一块可写入的内存空间。

内容的提问来源于stack exchange,提问作者Nicholas Fresta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 21:37:04