[英]Passing a struct as a pointer, resulting in a corrupted array?
我有一个传递为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。 这很奇怪。
我认为问题在于传递给函数的是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
指针,而不要传递指向args
指针的指针:
(*find_queens)(args);
出于好奇,您是否有理由要使用void*
而不是struct queens_arg*
? 问题的一部分是编译器无法诊断无意义的转换,因为您首先要通过void*
所有漏斗处理。
即使根据C标准,将指向结构的指针强制转换为* void并返回也是完全合法的,这不太可能成为问题。 您确定指针实际上是作为指向结构Queens_arg的指针开始的吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.