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

typedef指针类型结构体成员访问报错:非结构体/联合体请求成员ligne

修复结构体指针访问成员的错误

错误原因

你定义的coordonnees是指向struct couple的指针类型,而函数voisin_egaux的参数coordonnees **a_visiter是二级指针。代码中(a_visiter+(*p))->ligne的问题在于:a_visiter是二级指针,a_visiter+(*p)移动的是二级指针的位置,得到的是另一个指针变量的地址,并非结构体的地址,自然无法用->访问结构体成员。

另外,将typedef直接定义为指针类型本身就容易造成类型混淆,增加代码理解和维护的难度,这也是引发错误的间接原因。

修复方案

方案1:不修改typedef,调整函数内的访问逻辑

保留原typedef定义,修改voisin_egaux内的结构体成员访问方式,先通过*a_visiter拿到指向结构体数组的一级指针,再访问对应位置的元素:

void voisin_egaux(char matrice[][DIMENSION+1],int x, int y,coordonnees **a_visiter,int *p)
{
    if (matrice[x][y]==matrice[x+1][y]){
        // 方式1:指针运算结合解引用
        (*(*a_visiter + *p)).ligne = x+1;
        (*(*a_visiter + *p)).colonne = y;
        // 方式2:数组下标(更直观)
        // (*a_visiter)[*p].ligne = x+1;
        // (*a_visiter)[*p].colonne = y;
        ++(*p);
    }
}

方案2:调整typedef定义(更推荐)

将typedef改为结构体类型的别名,而非指针类型,让代码类型更清晰,从根源避免混淆:

// 重新定义typedef,指向结构体本身而非指针
typedef struct couple
{
    int ligne;
    int colonne;
} coordonnees;

int main()
{
    // 声明结构体指针
    coordonnees *a_visiter;
    // 分配内存时直接用typedef的类型,更简洁
    a_visiter = (coordonnees*)malloc(DIMENSION*4*sizeof(coordonnees));
    int p=0;
    // 调用函数时传入指针地址(如果不需要修改a_visiter本身,可直接传指针)
    voisin_egaux(matrice, x, y, &a_visiter, &p);
    // ...后续代码
}

void voisin_egaux(char matrice[][DIMENSION+1],int x, int y,coordonnees **a_visiter,int *p)
{
    if (matrice[x][y]==matrice[x+1][y]){
        // 用数组下标访问结构体成员,逻辑清晰
        (*a_visiter)[*p].ligne = x+1;
        (*a_visiter)[*p].colonne = y;
        ++(*p);
    }
}

优化补充:简化函数参数

如果你的函数不需要修改a_visiter指针本身的地址(比如不需要重新分配内存改变它指向的位置),可以将函数参数简化为一级指针,代码更简洁:

void voisin_egaux(char matrice[][DIMENSION+1],int x, int y,coordonnees *a_visiter,int *p)
{
    if (matrice[x][y]==matrice[x+1][y]){
        a_visiter[*p].ligne = x+1;
        a_visiter[*p].colonne = y;
        ++(*p);
    }
}
// main中调用方式:
// voisin_egaux(matrice, x, y, a_visiter, &p);

内容的提问来源于stack exchange,提问作者Elas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 10:26:03