簡體   English   中英

將結構傳遞給C中的泛型函數

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

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