Передача структуры в качестве указателя, в результате чего поврежденный массив? - PullRequest
0 голосов
/ 14 февраля 2011

У меня есть структура, передаваемая в качестве пустого * указателя

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 ]

5 голосов
/ 14 февраля 2011

Я думаю, что проблема в том, что вы передаете в функцию 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*.

0 голосов
/ 14 февраля 2011

Преобразование указателя на структуру в * void и обратно совершенно законно даже в соответствии со стандартом C, поскольку это вряд ли является проблемой. Вы уверены, что указатель действительно начинается как указатель на вашу структуру queens_arg?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...