我可以用temp addr结构调用bind()吗?

Jof*_*sey 2 c sockets

bind()函数const struct sockaddr *addr作为参数之一.我可以传递一个临时sockaddr结构,在bind()调用后会立即删除吗?

void bindMe(int socket) {
    struct sockaddr_in addr = {...};
    bind(socket, (struct sockaddr_in*)&addr, sizeof(sockaddr_in));
}
// addr is no more exist after function calling, 
// but I still want to work with the socket.
Run Code Online (Sandbox Code Playgroud)

此外,POSIX中有很多函数将指针指向结构.如何在函数调用后确定是否可以释放结构?

Ada*_*eld 6

是的,你可以这样做. bind是一个同步系统调用,所以一旦它返回,内核就完成了所有参数.

如果套接字是非阻塞的并且bind返回EINPROGRESS以指示绑定是异步发生的,则释放结构仍然是安全的.当操作异步完成时,内核会在内部复制结构.

如何在函数调用后确定是否可以释放结构?

阅读文档.大多数POSIX函数是同步的,并且在函数返回后可以安全地释放参数,但这并不总是正确的.如果您不确定,请阅读文档.显然,如果程序中有多个线程,则在API调用正在进行时,不应同时从另一个线程修改数据.