首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

《UNIX网络编程》中 “值-结果参数(value-result)”应该怎么理解

2012-04-10 
《UNIX网络编程》中 “值-结果参数(value-result)”应该如何理解?2、与前面的传递方向相反,从内核到进程传递套

《UNIX网络编程》中 “值-结果参数(value-result)”应该如何理解?
2、与前面的传递方向相反,从内核到进程传递套接口地址结构有四个函数:accept、recvfrom、getsockname 和 getpeername。这4个函数的两个参数是:指向套接口地址结构的指针和指向表示结构大小的整数的指针,例如:

C/C++ code
 struct sockaddr_un cli;     /* Unix domain */socklen_t len;len = sizeof(cli);getpeername(unixfd, (SA*) &cli, &len )/* len may have changed */
 
为何将结构大小由整数改为指向整数的指针呢?这是因为:当函数被调用时,结构大小是一个值(value, 此值告诉内核该结构的大小,使内核在写此结构时不至于越界),当函数返回时,结构大小又是一个结果(result,它告诉进程内核在此结构中确切存储了多少信息),这种参数叫做值-结果参数(value-result)。
*****************************
这段话中红色的部分阐述的原因应该怎么理解啊?不就是写成 &len 这样嘛,有这么多作用??请前辈们用自己的通俗易懂的话稍作解释下,thanks in advance!

[解决办法]
这个可以理解为传址方式。这个地址的数据在函数中有可能被修改。
[解决办法]
通俗一点的理解就是:参数既做value输入,又做result返回。
[解决办法]
再通俗点,就是该参数既是输入参数也是输出参数
[解决办法]
调用之前,给这个参数一个初值,表示一个最大容量,函数内部会使用这个初值
调用之后,函数会修改这个参数,表示实际使用的空间

比如,你调用之前,说我的钱包只能装3000,装吧
调用之后,函数说,装好了,给你装了500
[解决办法]
C/C++ code
#include <stdio.h>void a2(int *a){        int tmp;        tmp = (*a) * (*a);        *a = tmp;}int main(int ac, char **av){        int a;        a = 5;        printf("a = %d\n", a);        a2(&a);        printf("a = %d\n", a);        return 0;}
[解决办法]
直接用len的话,函数怎么能修改这个参数?
[解决办法]
在从内核到进程传递套接口地址时会设置len的值,如果直接用len,就取不到那个值了。

热点排行