簡體   English   中英

什么是(void *)類型? 我該如何取消引用呢?

[英]What is the (void*) type? And how can I dereference it?

假設您有一個像下面這樣的結構:

struct msgbuf {
 char msgtext[MAX_LENGTH];
}

然后將其轉換為(void *)

struct msgbuf m;
m.msgtext = "Text";
(void*) m;

  1. 什么是(void *)?與該結構有關的值是什么?

  2. 強制轉換后如何獲取m的msgtext的值? (我通過取消引用來假設)


編輯:詳細說明而不發布太多的代碼,我想將結構傳遞給我正在創建的POSIX線程。

th_ret = pthread_create( &thread1, NULL, method_called, (void*) m);

void *method_called( void *rsp)
{
//get text from *rsp, which should be m passed
}

您想將&m傳遞給pthread_create() (例如,通過引用傳遞該結構)。 &m是您的結構的地址,並且地址與void *兼容。

盡管如果在函數聲明中以這種方式明確聲明結構,則可以按傳遞該結構,但它存在風險且不贊成使用。 當通過void *參數發送結構時,由於一個明顯的原因, 必須通過引用傳遞結構-結構通常不能包含在sizeof(void *)數量的內存中。

pthread_create()使用void *參數類型是通用為可能的,例如,以適應各種定長類型的可以容納在堆棧空間,其中,大量的數據可以通過將指針傳遞到被間接引用的少量他們代替。

函數參數為void * ,而struct定義為:

 struct {
   .
   .
   .
 } myStruct;

這是合法的:

 (void *)&myStruct  // pass by reference

這是非法的(編譯器不允許這樣做):

 (void *)myStruct  // pass by value

有時人們將簡單的intunsigned int傳遞給線程,因為它更簡單且足以滿足他們的需要,但是通常,通過引用傳遞指向struct的指針以傳達任意數量的上下文相關數據。

例如,如果您只想傳遞整數或浮點數,則可以將int (和其他幾種數據類型)轉換為void * ,反之亦然。 重要的是,您傳遞參數的方式應與以后的解釋相一致。

致電:

   struct msgbuf {
       char msgtext[MAX_LENGTH];
   } m;
   th_ret = pthread_create( &thread1, NULL, method_called, &m);

處理:

   void *method_called(void *rsp) {
       struct msgbuf *m = rsp;
       printf("%s\n", m->msgtext);
   }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM