使用->仍报错‘g是指针,应使用->’的C语言指针问题求助
指针报错排查:
g is a pointer; did you mean to use ‘->’? 明明用了->仍报错 - 报错信息:
g is a pointer; did you mean to use ‘->’? - 问题场景:使用指针时触发上述报错,但代码中已经使用
->运算符,尝试*(g)->Set[i]、*(g->Set[i])等写法均无法解决。
原始代码
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> struct set { // 集合的容量(可存储元素数量) int capacity; // 集合当前元素数量 int size; char *array; }; typedef struct set set; typedef struct gra { set *Set; } graph; set *set_empty(); graph **make_graph(int nodes); set *set_empty() { set *s = malloc(sizeof(set)); s->capacity = 0; s->size = 0; s->array = malloc(sizeof(char)); return s; } graph **make_graph(int nodes) { graph **g = calloc(nodes - 1, sizeof(graph)); for (int i = 0; i< nodes; i++) { *g->Set[i] = set_empty(); } return g; } int main() { graph **g = make_graph(5); }
补充的更新版代码
graph *make_graph(int nodes) { graph *g = malloc(nodes * sizeof(graph)); for (int i = 0; i< nodes; i++) { g->Set[i] = set_empty(); } return g; }
问题根源与解决方法
1. 运算符优先级与指针类型不匹配
原始代码中graph **g是二级指针(指向graph*的指针),直接用g->Set是错误的:->运算符只能用于一级指针(指向结构体的指针),二级指针必须先解引用得到一级指针后才能访问成员,比如(*g)->Set。但这里你的需求是创建一个graph数组,用二级指针完全没必要,反而增加复杂度。
2. 更新版代码的错误点
更新后的graph *g是指向graph数组首元素的指针,此时g->Set访问的是数组第一个元素的Set成员,g->Set[i]相当于(g[0].Set)[i],这显然不是你想要的——你需要给数组中每个graph元素的Set成员赋值,应该用g[i].Set(因为g[i]是数组中的第i个graph结构体,直接用.访问成员)。
3. 修正后的代码
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> struct set { int capacity; int size; char *array; }; typedef struct set set; typedef struct gra { set *Set; } graph; set *set_empty(); graph *make_graph(int nodes); set *set_empty() { set *s = malloc(sizeof(set)); if (s == NULL) { // 新增内存分配检查 perror("malloc for set failed"); exit(EXIT_FAILURE); } s->capacity = 0; s->size = 0; s->array = malloc(sizeof(char)); if (s->array == NULL) { // 新增内存分配检查 perror("malloc for set array failed"); free(s); exit(EXIT_FAILURE); } return s; } graph *make_graph(int nodes) { // 分配nodes个graph结构体的内存 graph *g = malloc(nodes * sizeof(graph)); if (g == NULL) { // 新增内存分配检查 perror("malloc for graph failed"); exit(EXIT_FAILURE); } for (int i = 0; i < nodes; i++) { // 给第i个graph元素的Set成员赋值 g[i].Set = set_empty(); } return g; } int main() { graph *g = make_graph(5); // 后续记得释放内存,避免泄漏 for (int i = 0; i < 5; i++) { free(g[i].Set->array); free(g[i].Set); } free(g); return 0; }
额外提示
- 内存分配后一定要检查是否成功(
malloc/calloc返回NULL表示分配失败),避免后续非法访问。 - 不再使用的内存要及时释放,避免内存泄漏。
- 明确指针类型:一级指针用于指向单个结构体或结构体数组,二级指针一般用于指向指针数组或动态分配的指针集合,不要滥用。
内容的提问来源于stack exchange,提问作者user20895221
相关产品推荐
相关产品推荐

