为全局变量设置值的 C 函数参数?

标签 c function pointers arguments return-value

我正在创建可以为函数传递的参数变量声明值的函数。

例如,从我的 server.c 文件:

int sfd;    //socket file descriptor
int listenv;  //if listen
struct sockaddr_in serverAddress;   //server address

int main(int argc, char * argv[]) { //argv[0] == server //argv[1] == port number

    listenv = setServer(argv[1],serverAddress,sfd);
            //int port = ntohs(serverAddress.sin_port);
            printf("sfd = %d port = %d\n", sfd, ntohs(serverAddress.sin_port));
    while (listenv == 0) {
    }
}

从我的 serverAPI.h 文件:

int setServer (char * portn,struct sockaddr_in saddr,int sfd) {

    saddr.sin_family = AF_INET;
    saddr.sin_addr.s_addr = htonl(INADDR_ANY);
    saddr.sin_port = (int)htons(atoi(portn));


    sfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sfd < 0)
        error("ERROR opening socket");
    printf("Successfully opened socket sfd = %d\n",sfd);

    if (bind(sfd, (struct sockaddr *) &saddr, sizeof(saddr)) == -1 )
        error("ERROR on binding");
    printf("Successfully Binded on port %d\n", ntohs(saddr.sin_port));//show correct port number

    int listenv;
    if((listenv = listen(sfd,5)) < 0)
        error("ERROR on listening");
    //print message to show connection has been made
    printf("Ready and Listening...");

    return (listenv);
}

这就是我所拥有的...

而且我预计从“setServer”函数中,传递的变量(即 ServerAddress 和 sfd)的值应该由函数声明,但它没有...

所以setServer函数内部的返回值为:

serverAddress.sin_port = 12345
sfd = 3
listenv = 0

和主要的:

serverAddress.sin_port = 0
sfd = 0
listenv = 0

因为它已被列为全局。

我必须将什么设置为 setServer 的参数,以便它可以为全局变量设置值?

最佳答案

由于 C 通过按值复制传递参数,因此在修改 sfdsaddr 时,您只需修改参数本身,即, 传递参数的副本。您需要传递指针才能实际修改变量。像这样声明 setServer:

int setServer (char * portn, struct sockaddr_in* saddr, int* sfd);

添加解引用运算符:

saddr->sin_family = AF_INET;
saddr->sin_addr.s_addr = htonl(INADDR_ANY);
saddr->sin_port = (int)htons(atoi(portn));


*sfd = socket(AF_INET, SOCK_STREAM, 0);
if (*sfd < 0)
    error("ERROR opening socket");
printf("Successfully opened socket sfd = %d\n",*sfd);

if (bind(*sfd, (struct sockaddr *) saddr, sizeof(*saddr)) == -1 )
    error("ERROR on binding");
printf("Successfully Binded on port %d\n", ntohs(saddr->sin_port));//show correct port number

int listenv;
if((listenv = listen(*sfd,5)) < 0)
    error("ERROR on listening");
//print message to show connection has been made
printf("Ready and Listening...");

return (listenv);

然后用指针调用setServer:

listenv = setServer(argv[1],&serverAddress,&sfd);

关于为全局变量设置值的 C 函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33184562/

相关文章:

matlab - 函数返回向量而不是标量

c - 在 gcc 中出现错误但仍然成功运行

c - c中int**函数的返回

c# - 在 C# 中释放 C 分配的内存

c - 在使用 fmemopen 打开的 FILE* 上使用 rewind()

c - 如何在结构体中使用指针?

javascript - 将函数传递给另一个函数 : Using a variable within the function as the argument to the functions being passed to it

c - 如果从函数返回,如何获取结构数组中的元素数? +返回时如何处理内存泄漏?

字符串和数字的组合在c中无法正确比较

c - Bar 的第一个成员是 Foo 结构,任何对 Bar 的引用也是对 Foo 的有效引用