C语言报错:subscripted value is neither array nor pointer nor vector求助
问题分析与代码修正建议
先直接点明你遇到的核心问题:
你看到的error: subscripted value is neither array nor pointer nor vector错误,本质是对变量类型的误用,和结构体声明无关——先给你吃个定心丸,你的结构体声明是完全正确的!
1. 直接触发错误的原因
看你代码里的这行(以及类似的st[maxcounter]写法):
if (st[maxcounter].id > maxid){
函数AddStudent的第一个参数是student st——这是一个单个的student结构体变量,不是数组,也不是指向结构体的指针。C语言里只有数组或指针类型的变量才能用[下标]的方式访问元素,单个结构体变量根本不支持这种写法,所以编译器才会抛出这个错误。
另外你代码里的t变量也有严重逻辑问题:
student t[] = {"",0};
这行声明的是一个长度仅为1的student数组(因为你只给了一组初始化值)。当maxcounter初始为0,执行maxcounter++后变成1,再用t[maxcounter]访问的就是数组的第2个元素,这已经超出了数组的边界,属于越界访问,不仅逻辑错误,还会导致未定义行为。
2. 你的结构体声明完全没问题
再确认一遍:
typedef struct{ char name[MAXSTRING]; int id; }student;
这个结构体定义没有语法错误,错误全部出在后续的变量使用和函数逻辑上。
3. 代码里的其他隐性问题
除了上面的核心错误,还有几个必须修正的细节:
scanf("%s", name[MAXSTRING]);:这里name[MAXSTRING]是name数组的第MAXSTRING个元素(已经越界,因为数组下标从0到99),scanf的第二个参数需要的是字符串的首地址,应该写成scanf("%s", name);t[maxcounter].name = name;:C语言里不能直接用=给字符数组赋值,需要用strcpy函数(记得包含<string.h>头文件),比如strcpy(t[maxcounter].name, name);- 函数逻辑混乱:你传入了
stArray参数,但全程没用到它,反而用了局部数组t,这样函数结束后t就会被销毁,添加的学生数据根本无法保存到外部数组里;另外maxid的更新逻辑也不对,应该是比较新添加的学生id和当前maxid,而不是用st[maxcounter].id
4. 修正后的核心逻辑示例
这里给你调整了一个能正常工作的版本,核心是用传入的stArray存储学生,修正了变量类型和逻辑问题:
#include <stdio.h> #include <stdlib.h> #include <string.h> // 新增strcpy需要的头文件 #define MAXSTRING 100 int counter = 0; int maxcounter = 0; int maxid = 0; typedef struct{ char name[MAXSTRING]; int id; }student; int AddStudent(student *stArray) { // 去掉没用的st参数,直接用传入的数组指针 int id; char name[MAXSTRING]; printf("First enter the student's id\n"); scanf("%d", &id); printf("Now enter the student's name\n"); scanf("%s", name); // 修正scanf的参数 // 更新maxid if (id > maxid) { maxid = id; } // 将数据存入传入的数组 stArray[maxcounter].id = id; strcpy(stArray[maxcounter].name, name); // 用strcpy赋值字符数组 printf("Added student id: %d\n", stArray[maxcounter].id); maxcounter++; // 最后再递增计数器 return 0; // 函数需要返回值,这里返回0表示成功 } // 测试用例 int main() { student students[10]; // 假设最多存10个学生 AddStudent(students); return 0; }
内容的提问来源于stack exchange,提问作者Krow Caw
相关产品推荐
相关产品推荐

