将结构作为指针传递,导致数组损坏?

nub*_*ela 0 c struct pointers

我有一个结构作为void*指针传入

void *find_queens(void *args) {  
Run Code Online (Sandbox Code Playgroud)

我尝试使用此方法将此指针转换为可用的结构

struct queens_arg *data = (struct queens_arg *) args;
Run Code Online (Sandbox Code Playgroud)

但是,存储在此内的数组

struct queens_arg {
  int board[64]; 
  int focus_idx;
};
Run Code Online (Sandbox Code Playgroud)

被称为董事会现在正在被破坏,并没有反映原始价值,有谁知道为什么?谢谢!

更多信息:

这是函数的开始:

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);
Run Code Online (Sandbox Code Playgroud)

这就是它的名称:

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);
Run Code Online (Sandbox Code Playgroud)

当我打印数组时,我得到了这个:

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
Run Code Online (Sandbox Code Playgroud)

而不是一路0.这很奇怪.

tem*_*def 5

我认为问题在于你传递给函数的是a struct queens_arg**,而不是a struct queens_arg*.请注意,您在此处传入指针指针:

(*find_queens)(&args);
Run Code Online (Sandbox Code Playgroud)

当你尝试在这里进行类型转换:

struct queens_arg *data = (struct queens_arg *) args;
Run Code Online (Sandbox Code Playgroud)

您将a转换struct queens_arg**为a struct queens_arg*,这不是有意义的转换.你最终会读取指针附近的数据,就好像它是一个struct queens_arg,这不是你想要的.

要解决这个问题,只需自己传入args指针,而不是指向指针的args指针:

(*find_queens)(args);
Run Code Online (Sandbox Code Playgroud)

出于好奇,你有没有理由void*而不是一个struct queens_arg*?问题的一部分是编译器无法诊断无意义的演员表,因为你void*先通过汇集所有内容.