C语言结构体数组初始化报excess elements、->类型无效问题咨询
报错原因与修正方法
第一个报错:excess elements in struct initializer
这个报错对应第18行全局作用域的赋值语句:
arr[4] = {"gaston","trad",9,2020,150,'N'};
问题出在两个C语言基础规则:
- 函数(比如main)外部的全局作用域,只能写变量的声明、初始化语句,不能写单独的执行类赋值代码。你这行是独立的赋值操作,写在全局域本身就不符合语法规范。
- 大括号包裹的初始化列表,只能在变量声明的同时用来初始化,不能给已经声明完成的变量直接做整体赋值。你之前注释掉的逐字段给结构体成员赋值的思路是对的,只是后面访问成员时用错了符号。
如果要在main外部完成第5个数组元素的初始化,正确写法是在声明全局数组时就通过下标指定初始化对应元素,不需要单独写赋值行。
第二个报错:invalid type argument of '->' (have 'int')
这个报错对应main函数里32-37行初始化第3个元素的代码,核心是搞混了两种结构体成员访问符的使用场景:
->是结构体指针专用的成员访问符,左边必须是指向结构体的指针类型- 你定义的
arr是结构体数组,arr[2]是数组中存储的结构体实体,不是指针,访问它的成员必须用.符号,和你注释代码里写的arr[4].beta用法完全一致。你错用->后,编译器会尝试把arr[2]当地址解析,自然报类型不匹配错误。
修正后的对应代码段
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "project.h" //Create an array of size 1000 of your datatype as global variable // 声明时直接初始化下标为4的第5个元素,完成main外的初始化要求 struct PROJECT arr[1000] = { [4] = {"gaston","trad",9,2020,150,'N'} }; int main(int argc, char * argv[],char * envp[]) { //Initialize 3rd element of array,把所有->替换为. strcpy(arr[2].beta,"jug"); strcpy(arr[2].type,"speed"); arr[2].grade=12; arr[2].year=2022; arr[2].weight=125; arr[2].sent='Y'; // 其余原有业务代码... return 0; }
内容的提问来源于stack exchange,提问作者EV20
相关产品推荐
相关产品推荐

