【问题标题】:expected expression before ‘{’ token“{”标记之前的预期表达式
【发布时间】:2013-12-28 21:11:47
【问题描述】:

为什么会出现此错误以及如何解决?

void add(struct Data* data,char* name, char* hobbies[])
{
    size_t lenn=strlen(name);
    data->name=(char*)realloc(data->name,lenn+1);
    memcpy(data->name,name,lenn+1);

}


int main()
{
    struct Data data;
    s_init(&data);
    add(&data,"Jose",{"Sing","Run"});
    return 0;
}

错误:

ayuda.c:32:19:错误:“{”标记之前的预期表达式 add(&data,"Jose",{"Sing","Run"});

【问题讨论】:

  • 这不是有效的语法...
  • 由于除此之外的许多其他错误,此代码甚至无法编译。
  • @hacks:当然,错误是编译错误……

标签: c pointers char expression


【解决方案1】:

使用 C99 复合文字消除错误:

add(&data, "Jose", (const char *[]){ "Sing", "Run" });

另外,请:

  1. 使用空格;
  2. 注意 const 正确性(指向字符串字面量的指针应为 const char *,同样,您的函数应接受 const char *[] 参数);
  3. do NOT cast the return value of realloc()!

【讨论】:

    【解决方案2】:

    你不能直接把{"Sing","Run"}作为参数,你需要创建一个数组然后作为参数传递,例如:

    char* values[] = {"Sing","Run"};
    add(&data,"Jose",values);
    

    【讨论】:

    • 自 1999 年以来就不是这样了。
    【解决方案3】:

    您只能使用 {"...", "..."} 作为数组初始化的一部分。您不能从代码内部执行此操作。但是,您可以稍后在创建数组后使用 var[x] 语句访问元素,其中 x 是您尝试访问的元素的索引。

    【讨论】:

    • “您只能将 {"...", "..."} 用作数组初始化的一部分" - 直到 1999 年才如此。
    • 您不能使用该代码,除非它是初始化的一部分。如果您尝试从代码中执行此操作,则必须添加更多语句。 m0skit0 和我的帖子在技术上仍然是正确的,但您可以向 OP 添加代码以使其成为可能
    【解决方案4】:

    {"Sing","Run"} 将其作为数组传递

    【讨论】:

      猜你喜欢
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-29
      相关资源
      最近更新 更多