我有这样的结构:
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"};
它会给出一个错误:期望的表达式
谢谢!
答案 0 :(得分:6)
它不起作用,因为C不知道{3,"三个"}应该是什么类型; C没有看到" ="的左侧。操作员猜测您的类型,因此您没有任何类型信息。使用C99,您可以使用复合文字:
three = (struct foobar) { 3, "three" };
强制转换给出了类型,大括号中的大括号中的值。结果将分配给您的变量三。
答案 1 :(得分:5)
“初始化”和“赋值”虽然具有非常相似的语法,但却有两种不同的限制。
“初始化”是指在变量定义过程中定义变量的初始值。相反,赋值为程序中其他地方定义的变量赋值。
C不支持对struct
或array
类型的变量的赋值,但它支持这些类型的变量的初始化:
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,"三"}