You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用->仍报错‘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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 04:45:40