Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C addrinfo结构在函数调用后不保留值_C_Sockets_Memory - Fatal编程技术网

C addrinfo结构在函数调用后不保留值

C addrinfo结构在函数调用后不保留值,c,sockets,memory,C,Sockets,Memory,我有一个静态addrinfo结构,用于将调用getaddressinfo()的结果保存在静态函数init_socket()中。在init_socket()中,addrinfo结构具有正确的值,但在返回时它会被置零 下面是我试图完成的代码 static struct addrinfo rxRes; static int init_socket(struct addrinfo *resInfo, char *host, char *port) { struct addrinfo hints

我有一个静态addrinfo结构,用于将调用getaddressinfo()的结果保存在静态函数init_socket()中。在init_socket()中,addrinfo结构具有正确的值,但在返回时它会被置零

下面是我试图完成的代码

static struct addrinfo rxRes;

static int init_socket(struct addrinfo *resInfo, char *host, char *port) {
    struct addrinfo hints;
    memset(&hints, 0, sizeof hints);

    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_DGRAM;

    if (!host) { // automatically assign ip to result ip of current machine
        hints.ai_flags = AI_PASSIVE;
    }

    int res = getaddrinfo(host, port, &hints, &resInfo);
    if (res != 0 || !resInfo) {
        PRINT_NET_ERR(res);
        exit(EXIT_FAILURE);
    }

    printf("init addrlen: %d\n", resInfo->ai_addrlen); // correct output

    return socket(resInfo->ai_family, resInfo->ai_socktype, resInfo->ai_protocol);
}

int main(int argc, char *argv[])
{
    /* initialize socket connections */
    int rxsFD = init_socket(&rxRes, TEST_HOST, TEST_PORT);
    printf("main addrlen: %d\n, rxRes.ai_addrlen) // outputs 0
    ...
}




resInfo
是函数中的局部变量,因此对它的任何更改都不会反映在调用方中。调用方需要传入指向指针的指针,而不仅仅是指针。
getaddinfo
将分配动态内存。是的,这是一个有点混乱,所以请参阅下面的更正代码,希望它更清楚

static int init_socket(struct addrinfo **resInfo, char *host, char *port) {
    ..   
    int res = getaddrinfo(host, port, &hints, resInfo);
    ..
}

int main(int argc, char *argv[])
{
    struct addrinfo *rxRes;
    /* initialize socket connections */
    int rxsFD = init_socket(&rxRes, TEST_HOST, TEST_PORT);
    printf("main addrlen: %d\n, rxRes->ai_addrlen);

    /* free the result when no longer needed */
    freeaddrinfo(rxRes);
    ...
}

补充答案:

我认为您需要使用另一个指针来访问函数
init_socket()
中的
addrinfo结构
,以便使用
socket()
函数返回

所以你可以做到:

    struct addrinfo *addrRet = *resInfo;
    printf("initsocket: %d\n", addrRet->ai_addrlen);

    return socket(addrRet->ai_family, addrRet->ai_socktype, addrRet->ai_protocol);

对不起,我的回答是。我不能写评论(没有声誉)。

@500 InternalServerError这是行不通的。
getaddrinfo
的最后一个参数需要是一个双指针。我尝试在init_套接字中取消引用,并获得一个segfault
printf(“init addrlen:%d\n”,(*resInfo)->ai_addrlen)你完全复制了我的原始代码吗?抱歉,有一个错误。传递给
getaddrinfo
的最后一个参数应该是
resInfo
,而不是
&resInfo
。答案现在已更正。有效!谢谢你的帮助是的,我只是做了*(addrRet)->ai_家庭来完成这件事。感谢您分享此解决方案。我曾在Dev Cpp中尝试过这一点,但它确实在编译时返回了一个错误,因此我有了替代代码。