我需要定義一個包含一些可變長度值的表。我最好一次性宣告它,因為它與永遠不會改變的常量有關。我正在檢查是否可以避免使用動態解決方案,即使用 malloc 并在代碼中進行設定。
下面的代碼將僅作為我想要實作的偽代碼。這是行不通的。IE
typedef struct myelems {
char* name;
int count1;
int** values1;
int count2;
int** values2;
} myelems;
myelems arr[] = {
{"a", 3, {1, 2, 3}, 1, {42} },
{"b", 2, {123, 321}, 3, {99, 88, 77} },
// other elements here. . .
{"x", 0, NULL, 0 , NULL}
};
在此示例中,“a”將包含值 1 中的 3 個條目和值 2 中的 1 個條目,使得
arr[0].values1[0] = 1
arr[0].values1[1] = 2
arr[0].values1[2] = 3
arr[0].values2[0] = 42
“b”將在 values1 中包含 2 個條目,在 values2 中包含 3 個條目,這樣
arr[1].values1[0] = 123
arr[1].values1[1] = 321
arr[1].values2[0] = 99
arr[1].values2[1] = 88
arr[1].values2[2] = 77
和“x”在 values1 和 values2 中都有 0 個條目
我希望這不是一個愚蠢的問題,但我無法找到它是否不受支持或者它是否......如果是我應該怎么做?
感謝任何事情!
uj5u.com熱心網友回復:
如果復合文字是一個選項,您可以:
#include <stdio.h>
typedef struct myelems {
char* name;
int count1;
int* values1; // Notice a single star
int count2;
int* values2; // Notice a single star
} myelems;
int main(void)
{
myelems arr[] = {
{"a", 3, (int[]){1, 2, 3}, 1, (int[]){42}},
{"b", 2, (int[]){123, 321}, 3, (int[]){99, 88, 77}},
// other elements here. . .
{"x", 0, NULL, 0 , NULL}
};
}
您的方法似乎有點危險(容易出錯),因為您需要對count1和中的陣列元素數量進行硬編碼count2。在前處理器的幫助下,讓編譯器為您計數:
#define MAKE_INTS(...) \
sizeof((int[]){__VA_ARGS__}) / sizeof(int), (int[]){__VA_ARGS__}
int main(void)
{
myelems arr[] = {
{"a", MAKE_INTS(1, 2, 3), MAKE_INTS(42)},
{"b", MAKE_INTS(123, 321), MAKE_INTS(99, 88, 77)},
// other elements here. . .
{"x", 0, NULL, 0 , NULL}
};
}
MAKE_INTS(1, 2, 3)擴展到3, (int[]){1, 2, 3}.
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/399717.html
上一篇:如何合并兩個串列?[復制]
