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
相关产品推荐
相关产品推荐

