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