2011-02-13 54 views
0

我有一個結構被傳遞作爲一個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。這很奇怪。

+3

很難幫助這麼少的信息。你能發表一個有效的例子,說明問題嗎? – sleske 2011-02-13 23:59:02

+0

對不起,做了編輯 – nubela 2011-02-14 00:08:13

+0

這些操作是在同一個線程中嗎? – Abhi 2011-02-14 00:30:35

回答

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*彙總了所有內容。

0

即使根據C標準,將指向結構的指針轉換爲* void和返回也是完全合法的,但這不太可能成爲問題。你確定指針真的是作爲一個指向你的結構queens_arg的指針嗎?