structs 直接声明 C

structs direct declaration in C

提问人:Ricardi 提问时间:12/7/2021 最后编辑:Vlad from MoscowRicardi 更新时间:12/7/2021 访问量:314

问:

这段代码有什么问题?我不明白为什么这不起作用。

struct point {
    int x;
    int y;
} eh;

void main() {
    eh = {1, 2};
    printf("%i", eh.x);
}

但这工作正常

struct point {
    int x;
    int y;
} eh;

void main() {
    eh.x = 2;
    printf("%i", eh.x);
}
C 结构 体初始 化赋值运算符 复合文字

评论

1赞 Andrew Henle 12/7/2021
“不起作用”没有用。什么不起作用?
0赞 David Grayson 12/7/2021
是的。对于你将来的问题,最好描述你遇到的具体问题,并包括重现该问题的可编译代码(或接近编译的代码)。您提供的代码缺少声明,因此其他人不必要地难以重现您的问题。参见:最小可重复示例printf
0赞 Cheatah 12/7/2021
void main()应该是int main(void)

答:

7赞 David Grayson 12/7/2021 #1

这种语法可能适用于其他一些语言,但在 C 语言中,您应该编写:

eh = (struct point){1, 2};

右侧的表达式称为复合字面量

4赞 Vlad from Moscow 12/7/2021 #2

在 C 中,赋值运算符需要一个表达式,但在此表达式语句中

eh = {1, 2};

带支撑的列表不是一个表达式。

支撑列表可用于对象的初始化。例如,你可以写

struct point {
    int x;
    int y;
} eh = { 1, 2 };

struct point {
    int x;
    int y;
} eh = { .x = 1, .y = 2 };

或者,您可以在 main 中使用复合文本(如

eh = ( struct point ){ 1, 2 };

eh = ( struct point ){ .x = 1, .y = 2 };

复合文本创建一个未命名的对象,该对象的类型与分配给该对象的类型相同。一个结构类型的一个对象可以分配给同一结构类型的另一个对象。struct pointeh

您还可以使用复合文本初始化对象 eh

struct point {
    int x;
    int y;
} eh = ( struct point ){ .x = 1, .y = 2 };

注意,根据 C 标准,没有参数的函数 main 应声明如下

int main( void )
0赞 Cheatah 12/7/2021 #3

这也将起作用:

#include <stdio.h>

struct point {
    int x;
    int y;
};

int main(void) {
    struct point eh = {1, 2};
    printf("%i", eh.x);
}

请注意,我删除了一些东西,添加了包含并修复了函数类型和参数。stdio.hmain