C中的结构初始化,错误:预期表达式

时间:2017-04-26 19:34:20

标签: c

我有这样的结构:

struct foobar {
    int i;
    char *word;
};

我知道这会奏效:

struct foobar {
    int i;
    char *word;
};
struct foobar three = {3, "three"};

为什么这不起作用:

struct foobar {
    int i;
    char *word;
} three;
three = {3, "three"};

它会给出一个错误:期望的表达式
谢谢!

4 个答案:

答案 0 :(得分:6)

它不起作用,因为C不知道{3,"三个"}应该是什么类型; C没有看到" ="的左侧。操作员猜测您的类型,因此您没有任何类型信息。使用C99,您可以使用复合文字:

three = (struct foobar) { 3, "three" };

强制转换给出了类型,大括号中的大括号中的值。结果将分配给您的变量三。

答案 1 :(得分:5)

“初始化”和“赋值”虽然具有非常相似的语法,但却有两种不同的限制。

“初始化”是指在变量定义过程中定义变量的初始值。相反,赋值为程序中其他地方定义的变量赋值。

C不支持对structarray类型的变量的赋值,但它支持这些类型的变量的初始化

struct foobar three = {3, "three"}是初始化,因为该值与变量定义一起定义。这在C和C ++中都受支持。

相反,

struct foobar three; three = {3, "three"}是一个赋值,因为该变量是首先声明的,但该值是在一个单独的语句中赋值的。这在C中不受支持,但在C ++中将受支持。

答案 2 :(得分:1)

您似乎在这里尝试使用所谓的“实例化语法”。不幸的是,这仅在声明变量的那一刻起作用!

如果在声明后执行此操作(例如您的示例中的示例),则必须使用较麻烦的方法之一。

为了澄清,它是如何工作的:

struct foobar {
    int i;
    char *word;
    } three = {3, "three"};

答案 3 :(得分:-3)

之所以这样:

struct foobar {
    int i;
    char *word;
} three;
three = {3, "three"};

不起作用是因为你没有输入构造结构。

你想这样做:

typedef struct foobar {
      int i;
      char *word;
} three;

一旦你输入了type,现在有三个变成你的新数据类型,比如int或char。如果你想使用三个你想要这样做:

three x = {3, "three"};

初始化变量,例如x,并为其分配{3,"三"}

相关问题