如何正确地为数组(结构类型)元素赋值?

时间:2017-03-03 06:29:41

标签: c arrays struct variable-assignment compound-literals

#include <stdio.h>

struct virus
{
    char signature[25];
    int size;
}v[2];

int main(void) {

    static v[0] = {"Yankee",1813};
    static v[1] = {"Doodle",2813};
    int i;

    for(i=0;i<=1;i++)
    {
        printf("%s %d\n",v[i].signature,v[i].size);
    }

    return 0;
}

我在这个C代码中遇到了编译器错误。

  

错误:函数main()

中的声明语法

我猜测v[2]中存在一些错误,因为它与extern类相关联,而v[0]v[1]与静态类相关联。

但是,我不确定这是唯一的原因还是其他原因?

编辑:我通过删除错误的语法编辑了代码。

2 个答案:

答案 0 :(得分:4)

v[2]的声明没有错误,问题稍后。

你已经写过了

 static struct v[0] = {"Yankee",1813};

尝试定义0大小的数组,默认情况下C标准不允许这样做。

那就是说,语法也是非常错误的。你没有正确的类型,请记住,struct本身不是一个类型,它是一个关键字。 struct <something>实际上是类型

然后,从逻辑的角度来看,你可能根本不想要一个新的变量。如果你想使用v中的数组元素,只需使用变量名,即全部。像

这样的东西
#include <stdio.h>

struct virus
{
    char signature[25];
    int size;
}v[2] = { {"Yankee",1813}, {"Doodle",2813}}; //get it initialized, job done

int main(void) {

    int i;
    for(i=0;i<=1;i++)
    {
        printf("%s %d\n",v[i].signature,v[i].size);
    }

    return 0;
}

将以更好的方式完成工作,恕我直言。

编辑:

如果您对分配单个元素(初始化)感兴趣,那么,您不能为此目的使用大括号括起初始值设定项,它并不意味着是作业的RHS操作数。您需要使用 compound literal 来实现此目的,例如

v[0] = (struct virus){"Yankee",1813};
v[1] = (struct virus){"Doodle",2813};

也将完成这项工作。

答案 1 :(得分:0)

不要将结构定义与变量声明混淆,这是一种草率的做法。

相反,请使用typedef:

typedef struct 
{
    char signature[25];
    int size;
} virus_t;

然后你可以随意声明这种类型的变量:

static virus_t v[2] = 
{
  {"Yankee",1813},
  {"Doodle",2813}
};

或使用指定的初始值设定项

static virus_t v[2] = 
{
  [0] = {"Yankee",1813},
  [1] = {"Doodle",2813}
};