gpt4 book ai didi

C - addrinfo - 指针段错误

转载 作者:太空宇宙 更新时间:2023-11-04 01:56:13 24 4
gpt4 key购买 nike

C - addrinfo - 指针段错误

我遇到了段错误;我做了一个奇怪的修复,但我仍然很担心,因为我无法弄清楚问题出在哪里。任何见解都将是惊人的!在最后一个代码块中进行“修复”!

尝试使用 target_addrinfo 进行绑定(bind)时出现段错误:

struct addrinfo *my_server_res;
struct addrinfo *their_server_res;

int main(int argc, char **argv) {
//........
set_addrinfo();
handle_binding();
}

void set_addrinfo() {
int status;
struct addrinfo hints;
struct addrinfo *target_addrinfo; // fix (1/3): **target_addrinfo
char ipstr[INET6_ADDRSTRLEN];

// THIS IS TRUE, takes my_server_res
// fix(2/3): (l ? &my_server_res : &their_server_res)
target_addrinfo = (l ? my_server_res : their_server_res);

memset(&hints, 0, sizeof hints);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
char *node;
node = (l ? "localhost" : host_name);

// fix (3/3) 3rd argument: target_addrinfo
if ((status = getaddrinfo(node, port, &hints, &target_addrinfo)) != 0) {
fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
exit(1);
}

}

void handle_binding() {
struct addrinfo *target_addrinfo;
// THIS IS TRUE, takes my_server_res
target_addrinfo = (l ? my_server_res : their_server_res);
int b_res = bind(sockfd, target_addrinfo->ai_addr, target_addrinfo->ai_addrlen);
if (b_res == -1) {
perror("__Bind");
exit(1);
}
}

堆栈跟踪:再次尝试使用 my_server_res 时出现问题?:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000401e16 in handle_binding () at ncTh.c:385
385 int b_res = bind(sockfd, target_addrinfo->ai_addr, target_addrinfo->ai_addrlen);
(gdb) backtrace
#0 0x0000000000401e16 in handle_binding () at ncTh.c:385
#1 0x0000000000401cad in setup_socket () at ncTh.c:330
#2 0x0000000000401ad0 in main (argc=6, argv=0x7fffffffdea8) at ncTh.c:266
(gdb) frame 0
#0 0x0000000000401e16 in handle_binding () at ncTh.c:385
385 int b_res = bind(sockfd, target_addrinfo->ai_addr, target_addrinfo->ai_addrlen);
(gdb)

工作“修复”,对 set_addrinfo() 的更改:

struct addrinfo **target_addrinfo; // was *target_addrinfo
char ipstr[INET6_ADDRSTRLEN];

target_addrinfo = (l ? &my_server_res : &their_server_res); // was my_server_res : their_server_res

memset(&hints, 0, sizeof hints);
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;

char *node;
node = (l ? "localhost" : host_name);
// 3rd argument was &target_addrinfo :
if ((status = getaddrinfo(node, port, &hints, target_addrinfo)) != 0) {
fprintf(stderr, "getaddrinfo error: %s\n", gai_strerror(status));
exit(1);
}

最佳答案

原代码中:

struct addrinfo *target_addrinfo;
target_addrinfo = (l ? my_server_res : their_server_res);

这会将指针 my_server_res 的值复制到 target_addrinfo 中。

getaddrinfo(node, port, &hints, &target_addrinfo)

这会将指向 target_addrinfo 的指针(指向指针的指针)传递到函数 getaddrinfo 中,然后通过执行等效于 的操作为其分配一个新值>*&target_addrinfo = new_ptr.这个新值是指向 getaddrinfo 正在为您检索的信息的指针。

所有这些都对 my_server_res 没有影响,它保留其原始值,可能为 NULL。

在新代码中:

struct addrinfo **target_addrinfo;
target_addrinfo = (l ? &my_server_res : &their_server_res);

这会将指向 my_server_res 的指针复制到 target_addrinfo(现在是指向指针的指针)。

getaddrinfo(node, port, &hints, target_addrinfo)

这会将 target_addrinfo 的值(当前是指向 my_server_res 的指针)传递给函数 getaddrinfo,然后将新值赋给它,相当于 *target_addrinfo = new_ptrmy_server_res 现在包含指向 getaddrinfo 正在为您检索的信息的指针。

关于C - addrinfo - 指针段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33938527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com