我正在使用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");
这两种方法有什么区别?为什么第一种方法不起作用?
答案 0 :(得分:0)
我认为你应该为传递给void指针的变量分配内存:
char *line;
line = malloc(stringLength*sizeof(char));
答案 1 :(得分:0)
我实际上将内存分配给一个新变量,将字符串的内容复制到该变量中并将其传递给它,它现在似乎正常工作。
arg = (char*) malloc(strlen(line) * sizeof(char));
strcpy(arg, line);
ares_query(channel, line, ns_c_in, ns_t_mx, callback, arg);