我有一个结构作为void *指针传入
void *find_queens(void *args) {
我尝试使用此
将此指针转换为可用的结构struct queens_arg *data = (struct queens_arg *) args;
但是,存储在此
中的数组struct queens_arg {
int board[64];
int focus_idx;
};
被叫董事会现在正在被破坏,并没有反映原始价值,有谁知道为什么?谢谢!
此处提供更多信息:
这是该功能的开始:
void *find_queens(void *args) {
//vars
pthread_t thread1, thread2;
struct queens_arg *data = (struct queens_arg *) args;
int board[64];
copy_array(data->board, board);
print_board(data->board);
这就是它的名称:
int board[64] = {
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
};
struct queens_arg *args = malloc(sizeof (struct queens_arg));
args->focus_idx = 0;
copy_array(board,args->board);
(*find_queens)(&args);
当我打印数组时,我得到了这个:
39456784 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
而不是0。这很奇怪。
答案 0 :(得分:5)
我认为问题在于你传递给函数的是struct queens_arg**
,而不是struct queens_arg*
。请注意,您在此处传递指针指针:
(*find_queens)(&args);
当您尝试在此处进行类型转换时:
struct queens_arg *data = (struct queens_arg *) args;
您正在将struct queens_arg**
转换为struct queens_arg*
,这不是一次有意义的转换。你最终会在指针附近读取数据,好像它是struct queens_arg
,这不是你想要的。
要解决此问题,只需单独传递args
指针,而不是指向args
指针的指针:
(*find_queens)(args);
出于好奇,您是否有理由接受void*
而不是struct queens_arg*
?问题的一部分是编译器无法诊断无意义的演员表,因为你首先通过void*
汇集所有内容。
答案 1 :(得分:0)
将结构指针转换为* void并返回是完全合法的,即使根据C标准,这也不太可能是问题。你确定指针真的是作为指向你的struct queens_arg的指针吗?