我刚开始学习C并且很难尝试初始化一组结构。基本上,高级目标是获取一个字符串,如mustache template,并将其分解为存储在数组中的“静态字符串”或“变量”标记。然后理论上,为了渲染数组,你会检查“如果它是一个字符串,只需复制字符串,否则如果它是一个变量,获取值并将其添加到字符串”。
所以最初的步骤之一就是初始化一个可以处理任意数量令牌的数组,这就是我一直在尝试的:
typedef struct {
int *type; // probably pointing to an enum or something, but not there yet
char *value;
} token;
typedef struct {
// token *tokens[] // how to do this?
} template;
template
compile(char *source) { // source string
token tokens[] = malloc(sizeof(token) * 20) // 20 is arbitrary max
// ... rest of code
}
因此token tokens[]
有两个位置。怎么写呢?如果我尝试引用或没有引用,我会不断收到此错误:
error: array initializer must be an initializer list
token tokens[] = malloc(sizeof(tokens));
请注意,我在C ++中看到有矢量类,但我只想在直接C中执行此操作。
答案 0 :(得分:2)
你可以做到
typedef struct {
token* tokens;
} template;
t.tokens = malloc(sizeof(token)*20);
token* tokens[20]
将为您提供一个包含20个令牌的数组。当您需要20个令牌列表时,这将非常有用。
但是从我的问题我假设,你只需要一个列表ok标记,所以只需使用token* tokens
。
另一种选择是:
typedef struct {
token tokens[20]; // now you don't need malloc at all!
} template;
在第一种方法中,令牌的数量可以是动态的,并在运行时给出。对于第二个版本,必须在编译时知道(最大)令牌数。