簡體   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