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

时间:2011-02-13 23:55:52

标签: c pointers struct

我有一个结构作为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。这很奇怪。

2 个答案:

答案 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的指针吗?