0

我正在使用 c-ares 库对存储在文件中的一组域执行 dns 查找。像这样的东西。

char *line = NULL; 
while ((read = getline(&line, &len, fp)) != -1) {
        if (line && line[strlen(line)-1]=='\n') line[strlen(line)-1]=0;
        printf("Sending %s\n", line);
        ares_query(channel, line, ns_c_in, ns_t_mx, callback, line);
    }  

ares_query 函数的最后一个参数是 void *arg 类型,它只是传递回回调函数。详情在这里——

typedef void (*ares_callback)(void *arg, int status, int timeouts, unsigned char *abuf, int alen)

void ares_query(ares_channel channel, const char *name, int dnsclass, int type, ares_callback callback, void *arg)

上面的 ares_query 调用似乎没有通过“line”,我在回调中收到一个 NULL 变量。但是,当我用这样的文字调用它时,它似乎传递了 arg。

ares_query(channel, line, ns_c_in, ns_t_mx, callback, "HELLO");

这两种方法有什么区别?为什么第一种方法不起作用?

4

2 回答 2

0

我认为您应该为传递给 void 指针的变量分配内存:

char *line;
line = malloc(stringLength*sizeof(char));
于 2015-11-17T07:57:35.583 回答
0

我实际上将内存分配给了一个新变量,将字符串的内容复制到该变量中并将其传递给它,它现在似乎可以工作了。

arg = (char*) malloc(strlen(line) * sizeof(char));
strcpy(arg, line);
ares_query(channel, line, ns_c_in, ns_t_mx, callback, arg);
于 2015-11-17T22:39:09.300 回答