[英]Passing a struct into a generic function in C
我聲明了一個名為“ Struct”的新結構。我有一個通用函數,該函數接受參數“ void * data”。
void Foo(void *data)
我將“ Struct”的實例傳遞給泛型函數。
Struct s;
Foo(&s);
我想在函數中訪問結構的屬性之一。
void Foo(void *data) {
char *word = (char*) data.word;
}
不允許使用,因為它無法將數據識別為有效的結構。
我什至嘗試首先將數據聲明為struct類型,但出現錯誤。
void Foo(void *data) {
Struct s = (Struct) data;
char *word = s.word;
}
我得到“請求轉換為非標量類型”。
首先,您應該打開編譯器的警告標志(所有警告標志)。 然后,您應該將指針傳遞給您的Struct
並使用struct
以外的其他名稱作為變量名:
Struct s;
Foo(&s);
然后,在Foo
:
void Foo(void *data) {
Struct *s = data;
char *word = s->word;
}
另一方面,您不能像試圖將非指針類型與void*
進行相互轉換,另一方面,將指針類型與void*
也是有效的。
您需要向結構傳遞一個指針,並在函數內部獲取一個指向結構的指針:
Struct struct;
Foo(&struct);
void Foo(void *data) {
Struct* struct = (Struct*) data;
char *word = struct->word;
}
通過指針請求結構成員時,必須使用->
運算符。
這應該起作用: char *word = (char*) data->word;
您還必須將結構的地址傳遞給函數。 像這樣: Foo(&struct);
。
首先,您需要正確調用該函數:
Struct s;
Foo(&s);
注意,您現在正在傳遞一個指向結構的指針。
現在,該函數必須知道您正在使用Struct
(而不是其他東西)-可能是由於另一個參數,全局變量或某些其他原因。 然后在函數中可以執行以下操作:
void Foo(void *data) {
Struct *structpointer = p; /* Note - no need for a cast here */
/* (determine whether data does refer to a pointer then...) */
char *word = structpointer->word;
/* ... then use 'word'... */
}
數據是指針,因此將其強制轉換為指針也必須是指針。 如果您說Struct* myStruct = (Struct*) data
,那么世界一切都會好起來的。
您正在混合指針和數據。
Struct struct
定義數據對象
void *data
期望data
為指針。
使用指向Struct
的指針調用Foo
並進行其他必要的更改
Struct struct;
Foo((void*)&struct);
void Foo(void *data) {
Struct *struct = (Struct*)data;
char *word = struct->word;
}
或更緊湊的形式:
Struct struct;
Foo((void*)&struct);
void Foo(void *data) {
char *word = ((Struct*)data)->word;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.