[問題] Pthread中傳入void*[]的疑問

看板C_and_CPP作者 (severus)時間10年前 (2013/10/19 13:27), 編輯推噓2(2010)
留言12則, 5人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Linux 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) Pthread 問題(Question): void *print(void *args) { int* a = args[0]; //error:void value not ignored as it ought to be //warning: dereferencing 'void*' pointer printf("integer: %d\n", *a); return NULL; } int main() { pthread_t thread1; int a=1; char str[]="test"; void* arr[] = {&a, str}; pthread_create(&thread1, NULL, &print, arr); return 0; } 我有檢查了一下各變數的位址 &a 和 arr[0] 和 args[0]的值都是一樣的。 但是為什麼int *a無法接args[0]的值? 後來我有查到正確的寫法如下 int *a = ((void**)args)[0]; 這樣寫就沒有問題 不懂的是為什麼args要先轉型(cast)成void**才會過? 可是明明a是一個int pointer啊? 先謝謝了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.34.170.134

10/19 13:53, , 1F
錯誤訊息不就告訴你為啥了嗎 XD
10/19 13:53, 1F
其實看了還是不太懂是什麼意思

10/19 14:03, , 2F
你覺得 args[0] 的型態應該是什麼?
10/19 14:03, 2F
我覺得args[0]存的是&a, int的pointer args[0]本身位址應該是一個void*的pointer 應該沒錯吧

10/19 14:05, , 3F
此外 void 指標應該是不能使用 []
10/19 14:05, 3F
了解,剛試了一下, 但是我還是不懂為什麼要cast成(void**)型態, 就是必需寫 int *a = *((void**)args); 而不是寫成 int *a = *args;

10/19 14:08, , 4F
@Feis , void 指標不能用 [], 但 void* 指標可以用.
10/19 14:08, 4F

10/19 14:09, , 5F
offset sizeof(void*) , 不過這 "查到正確寫法" 也怪怪的.
10/19 14:09, 5F

10/19 14:10, , 6F
!! 現在才看到 Feis 在講哪段, 抱歉.
10/19 14:10, 6F
※ 編輯: fenir 來自: 1.34.170.134 (10/19 15:08) ※ 編輯: fenir 來自: 1.34.170.134 (10/19 15:17)

10/19 15:21, , 7F
原 PO 你要知道函式裡面不會知道函式外面的東西
10/19 15:21, 7F

10/19 15:21, , 8F
print 只會知道送給他的 args 是某指標, 而不會知道那個指標
10/19 15:21, 8F

10/19 15:22, , 9F
在外面實際上是什麼東西, 你必須自己用轉型告訴它
10/19 15:22, 9F

10/19 15:23, , 10F
這就是為什麼你必須先告訴它那是一個 void *[] (或曰void**)
10/19 15:23, 10F

10/19 15:23, , 11F
然後才能取其中的元素出來
10/19 15:23, 11F

10/19 15:36, , 12F
!! 原來如此,謝謝
10/19 15:36, 12F
文章代碼(AID): #1IOXXGsS (C_and_CPP)