新手疑问: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
相关产品推荐
相关产品推荐

