C语言报错‘request for member in something not a structure or union’咨询
问题排查与修正方案
你遇到的错误核心是结构体定义、类型匹配、变量作用域和语法问题导致编译器无法识别结构体成员,下面逐一排查并修正:
1. 结构体定义位置错误
结构体struct elementos定义在函数之后,导致busqueda_indexada函数无法识别该类型,必须把结构体定义放在所有使用它的函数之前。
2. 函数参数类型不匹配
busqueda_indexada的第一个参数声明为int a[],但你实际传入的是struct elementos类型的数组,参数类型完全不匹配,编译器自然无法识别结构体成员。需要修改函数参数为结构体数组。
3. 变量重定义与类型混淆
- 函数内部定义了
int elementos[3];,但你又有同名的结构体类型struct elementos,这会导致命名冲突,编译器无法区分你要访问的是int数组还是结构体数组。 - 代码中出现未定义的变量:
g、G、n、x,这些变量必须先声明或赋值才能使用。
4. 结构体初始化与语法错误
main函数中初始化结构体数组的方式错误,结构体初始化需要用{}包裹每个结构体的成员,比如{{"marco", 0, 1}, {"sin asignar", 3, 2}, {"pedro", 6, 3}}(这里indice对应分段的起始索引)。- 函数调用
busqueda_indexada(a, n, x)末尾缺少分号;elementos[ind].nombre=a[i]);多了一个右括号。 - 代码中出现不存在的结构体成员:
elem、错误的boleto/nombre引用逻辑。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> // 先定义结构体,确保所有函数都能识别 struct elementos { int indice; // 分段起始索引 char nombre[100]; // 元素名称 int boleto; // 用于索引查找的关键字 }; // 修改参数为结构体数组,明确查找的关键字是boleto int busqueda_indexada(struct elementos a[], int n, int x) { struct elementos indice_tab[3]; // 定义索引表数组,用结构体类型 int g = 3; // 索引表的长度,提前赋值 int i; int set = 0; int ind = 0; // 构建索引表:每3个元素取一个作为索引项 for (i = 0; i < n; i += 3) { strcpy(indice_tab[ind].nombre, a[i].nombre); indice_tab[ind].indice = i; indice_tab[ind].boleto = a[i].boleto; ind++; // 防止索引表越界 if (ind >= 3) break; } // 判断查找值是否小于第一个索引项 if (x < indice_tab[0].boleto) { return -1; } // 查找所属的分段 else { for (i = 1; i < g; i++) { if (x < indice_tab[i].boleto) { int ini = indice_tab[i-1].indice; int fin = indice_tab[i].indice; // 在[ini, fin)范围内线性查找 for (int j = ini; j < fin; j++) { if (a[j].boleto == x) { return j; // 返回找到的元素下标 } } set = 1; break; } } } // 处理最后一个分段 if (set == 0) { int ini = indice_tab[g-1].indice; int fin = n; for (int j = ini; j < fin; j++) { if (a[j].boleto == x) { return j; } } } // 未找到返回-1 return -1; } int main(int argc, char *argv[]) { // 正确初始化结构体数组:每个结构体用{}包裹 struct elementos a[6] = { {"marco", 0, 1}, {"ana", 1, 1}, {"luis", 2, 1}, {"sin asignar", 3, 2}, {"maria", 4, 2}, {"pedro", 5, 3} }; int n = 6; // 数组长度 int x = 2; // 要查找的boleto值 printf("%s y %d\n", a[2].nombre, a[2].boleto); int result = busqueda_indexada(a, n, x); if (result != -1) { printf("找到元素:%s,boleto=%d\n", a[result].nombre, a[result].boleto); } else { printf("未找到元素\n"); } return 0; }
关键修正说明
- 把结构体定义移到最前面,确保所有函数都能识别该类型。
- 统一函数参数类型,将
int a[]改为struct elementos a[],匹配传入的结构体数组。 - 修复命名冲突:函数内的索引表改用
indice_tab命名,避免和结构体类型名冲突。 - 补充未定义的变量,比如
n、x、g的赋值。 - 修正结构体初始化语法,每个结构体成员用
{}包裹,符合C语言规范。 - 完善索引查找的逻辑:先定位分段,再在分段内线性查找,返回找到的元素下标。
内容的提问来源于stack exchange,提问作者peter321
相关产品推荐
相关产品推荐

