[英]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;
什么是(void *)?與該結構有關的值是什么?
強制轉換后如何獲取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
有時人們將簡單的int
或unsigned 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.