如何在C中初始化动态结构数组?

时间:2014-04-14 21:55:42

标签: c arrays struct dynamic-arrays

我刚开始学习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中执行此操作。

1 个答案:

答案 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;

在第一种方法中,令牌的数量可以是动态的,并在运行时给出。对于第二个版本,必须在编译时知道(最大)令牌数。