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