簡體   English   中英

如何聲明和解壓縮成對的 void 指針數組?

[英]How can I declare and unpack an array of pairs of void pointers?

我想寫一個 function ,它需要一個void* “對”數組 - 每個都是一對指向某物的指針。 每對中的第一個元素將是一個字符串,第二個元素將是指向其他內容的指針。

我希望傳遞到 function 的數組聲明如下:

<what type?> argument = {
        { "some string", <some pointer>},
        { "some other string", <some other pointer>},
        // ... etc
        NULL // To signal ending
}

function(argument);

function內部,我想遍歷數組,訪問每個“對”,將“對”的成員轉換為它們各自的類型(我知道)並利用這些成員。

我遇到了一些麻煩。 起初,我嘗試將參數聲明為void* thing[][] 認為它是一個由void指針組成的 arrays 數組。

但是,簡單地嘗試訪問此類數組中的索引會給我錯誤: expression must be a pointer to a complete object type

閱讀 SO 我意識到編譯器正在考慮我正在嘗試取消引用void* 但我認為在這樣的數組上執行a[0]將訪問數組中的第一個“對”,這應該取消引用void** - 這是合法的。 我錯了嗎?

關於這個問題,go 的正確方法是什么,就數組的類型、它的初始化和迭代期間解包數組的方式而言?

你想要void *argument[][2] = { /*... */ }; . 您有一個未指定大小的數組,其元素是固定大小為 2 的 arrays,其元素是指向void的指針。 您最初的編譯器錯誤是因為當您有多個方括號時,只有第一組可以為空,因此添加2修復了它。

順便說一句,它可以作為指針衰減,在這種情況下它將是void *(*argument)[2]

請注意,您的哨兵NULL並沒有達到您的預期,因為它位於 arrays 和 arrays 的數組中,並不是完全的指針。 請注意此警告:

warning: suggest braces around initialization of subobject [-Wmissing-braces]
        NULL // To signal ending
        ^~~~
        {   }

這是一個使用該類型的示例程序:

#include <stdio.h>

void *g[][2] = {
        { "some string", (void*)0x1234},
        { "some other string", (void*)0x5678},
        { "some third string", (void*)0x9abc},
        // ... etc
        {NULL} // To signal ending
};


void print_things(void *argument[][2]) {
    for(int i = 0; argument[i][0] /* using just argument[i] instead of argument[i][0] here would not work as intended */; ++i) {
        printf("%s %p\n", (char*)argument[i][0], argument[i][1]);
    }
}

int main(void) {
    print_things(g);
    return 0;
}

最后一點,我想說使用自定義struct你的生活可能會更簡單:

#include <stdio.h>

struct pair {
    char *str;
    void *ptr;
} g[] = {
        { "some string", (void*)0x1234},
        { "some other string", (void*)0x5678},
        { "some third string", (void*)0x9abc},
        // ... etc
        {NULL, NULL} // To signal ending
};


void print_things(struct pair argument[]) {
    for(int i = 0; argument[i].str; ++i) {
        printf("%s %p\n", argument[i].str, argument[i].ptr);
    }
}

int main(void) {
    print_things(g);
    return 0;
}

暫無
暫無

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

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