结构体定义初始化成员报错:预期':'、','、';'、'}'或attribute
解决结构体定义时的初始化错误
嘿,这个错误的根源很明确:在C语言里,结构体类型的定义只是声明一种新的数据类型,你不能在类型定义阶段直接给成员变量赋值。你写的lista dati_mappa = NULL;和lista pos_valida = NULL;属于在结构体类型里直接初始化成员,这是不允许的,编译器自然会报错。
下面给你几种正确的写法:
方法1:先定义结构体类型,再定义变量并初始化
先完成结构体类型的声明,之后在定义具体变量的时候进行初始化:
typedef int data; struct nodo { data elem; struct nodo *next; }; typedef struct nodo *lista; // 仅声明结构体类型,不初始化成员 struct mappa { data R; data C; lista dati_mappa; lista pos_valida; }; // 定义结构体变量时,统一初始化成员 struct mappa my_mappa = {0, 0, NULL, NULL};
方法2:使用C99及以后的指定初始化器(更清晰)
如果你的编译器支持C99或更高标准,可以用指定初始化器来明确指定每个成员的初始值,可读性更好:
// 结构体类型定义同上... struct mappa my_mappa = { .R = 0, .C = 0, .dati_mappa = NULL, .pos_valida = NULL };
方法3:写一个初始化函数(适合频繁创建结构体变量的场景)
如果需要多次创建并初始化这种结构体变量,写一个专门的初始化函数会更灵活:
// 结构体类型定义同上... void init_mappa(struct mappa *m) { m->R = 0; m->C = 0; m->dati_mappa = NULL; m->pos_valida = NULL; } // 使用方式: struct mappa my_mappa; init_mappa(&my_mappa);
另外提个小建议:typedef struct nodo *lista;这种把指针类型重命名的写法虽然省事,但新手很容易忘记lista本质是指针,后续写代码时可能会出现混淆,如果你是C语言初学者,不妨先直接用struct nodo*来声明指针,等熟悉后再考虑用typedef简化。
内容的提问来源于stack exchange,提问作者user9586643
相关产品推荐
相关产品推荐

