【问题标题】:"lvalue required as unary '&' operand" in accept() socket system call接受()套接字系统调用中的“需要左值作为一元'&'操作数”
【发布时间】:2011-06-04 12:38:53
【问题描述】:

我正在编写一个网络程序,在服务器部分,我想使用侦听套接字接受来自多个客户端的连接。所以我声明了一个这样的地址结构数组:

struct sockaddr_in* client;

我使用 malloc 和后来创建的,以接受我键入的连接:

newsock = accept(fd_skt, (struct sockaddr *)&client[i], &(sizeof(client[i])));

然后我从编译器那里得到"lvalue required as unary '&' operand"。谁能弄清楚我做错了什么?

【问题讨论】:

    标签: c sockets compiler-errors


    【解决方案1】:

    是的,您不能获取不是 左值 的东西的地址,即具有地址的对象。 sizeof 运算符的结果只是一个值,它不是一个有地址的对象。

    您需要创建一个局部变量,以便获取它的地址。

    例如

    socklen_t addrlen = sizeof client[i];
    newsock = accept(fd_skt, (struct sockaddr *)&client[i], &addrlen));
    

    顺便说一句,struct sockaddr_in* client; 声明了一个指针,而不是一个数组。要将client 用作数组,您需要在调用accept 之前的某个时间点将其分配给动态分配的数组。当您说“我使用 malloc 创建”时,我认为这就是您正在做的事情。

    或者,您实际上可以将 client 声明为一个数组。

    struct sockaddr_in client[MAX_CLIENTS];
    

    【讨论】:

    • @Namratha:因为获取在内存中不一定有位置的东西的地址 - 即使它即将从内存中的那个位置消失 - 没有意义。
    【解决方案2】:

    Charles 的回答是正确的,但是要绕过这种需要指向您打算丢弃的值的指针的令人讨厌的函数接口的一种方法是使用复合文字:

    newsock = accept(fd_skt, (struct sockaddr *)&client[i], (socklen_t[]){sizeof client[0]});
    

    【讨论】:

    • 时髦的把戏,这种技术已经多次为我节省了一个“虚拟”变量。我不认为我将来会使用它,至少在这里这个技巧几乎是未知的,我宁愿不要让同事修补这个试图“提高可读性”左右。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多