繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM