C语言网络编程:getaddrinfo()函数参数采用指针形式的原因问询
C语言网络编程:getaddrinfo()函数参数采用指针形式的原因问询
嘿,很高兴你在钻研C语言网络编程的内容,关于getaddrinfo()参数为啥都是指针的问题,我来给你拆解明白~
先说说node和service这俩字符串参数
在C语言里,字符串本质就是char类型的数组,而数组名在传递的时候会自动退化为指向首元素的指针,所以你没法直接把整个字符串“传进去”,只能传它的首地址。而且函数用const修饰这俩指针,是在告诉你:放心,我只会读这个字符串的内容,绝对不会修改它。另外还有个好处是效率——如果直接传整个字符串的拷贝,遇到长域名或者服务名的时候,会额外占用内存还拖慢速度,用指针直接访问原数据就高效多了。
再聊你已经有点理解的hints参数
hints是个struct addrinfo结构体,这类自定义结构体通常尺寸不小,如果直接传值的话,会把整个结构体拷贝一份给函数,既费内存又没必要。用指针的话,函数直接通过地址访问你预先设置好的提示信息(比如指定用IPv4还是IPv6,要TCP还是UDP套接字),而且const修饰也保证了函数不会篡改你设置的这些参数。
最后是最特殊的res二级指针
这个参数是struct addrinfo **,为啥要用二级指针?因为getaddrinfo()要给你返回一个链表形式的地址信息结构体列表,这些结构体是函数内部动态分配内存创建的。C语言是值传递,如果你只传一级指针,函数内部对指针的修改没法同步到外部的变量里。用二级指针的话,函数就能直接把分配好的链表首地址赋值给你外部的指针变量,让你能在函数外面拿到结果,之后记得用freeaddrinfo()释放内存就行。
内容来源于stack exchange
相关产品推荐
相关产品推荐

