“lvalue nécessaire que unaire "& " opérande” dans accept() de l'appel système socket
Je suis en train d'écrire un programme de réseau d'où, dans la partie serveur, je veux accepter les connexions de plusieurs clients à l'aide d'un socket d'écoute. J'ai donc déclarer un tableau d'adresse des structures comme ceci:
struct sockaddr_in* client;
que je crée à l'aide de malloc et, plus tard, pour accepter les connexions de type I:
newsock = accept(fd_skt, (struct sockaddr *)&client[i], &(sizeof(client[i])));
et là, je reçois "lvalue required as unary '&' operand"
du compilateur. Quelqu'un peut-il comprendre ce que j'ai fait de mal?
OriginalL'auteur nikos | 2011-06-04
Vous devez vous connecter pour publier un commentaire.
Oui, vous ne pouvez pas prendre l'adresse de quelque chose qui n'est pas un lvalue, qui est un objet avec une adresse. Le résultat de la
sizeof
opérateur est juste une valeur, il n'est pas un objet avec une adresse.Vous avez besoin de créer une variable locale de sorte que vous pouvez prendre à son adresse.
E. g.
En aparté,
struct sockaddr_in* client;
déclare un pointeur, pas un tableau. Pour utiliserclient
comme un tableau, vous devez l'affecter à un tableau alloué dynamiquement à un certain point avant l'appel àaccept
. Je suppose que c'est ce que vous faites quand vous dites "j'ai créer à l'aide de malloc".Sinon, vous pouvez effectivement déclarer
client
comme un tableau.pourquoi devrait & opérateur de travailler uniquement pour une lvalue?
parce que prendre l'adresse de quelque chose qui n'est pas nécessairement un emplacement dans la mémoire - et même s'il n'est sur le point de disparaître à partir de cet emplacement de la mémoire n'a pas de sens.
OriginalL'auteur CB Bailey
Charles réponse est correcte, mais un moyen de contourner ce genre de désagréable interface de la fonction qui requiert un pointeur vers une valeur que vous prévoyez de les jeter est d'utiliser un composé de littéraux:
OriginalL'auteur R..