C语言结构体指针解引用方法及编译报错求助
问题分析与解决
嘿,咱们先拆解你遇到的问题:你看到的invalid type argument of unary '*'(have'int')报错,根源其实很简单——你在printf里对res[i].x和res[i].y用了*解引用,但这俩根本不是指针!
咱们一步步理清楚逻辑:
res是指向couple结构体的指针,res[i]等价于*(res + i),这已经是一个完整的couple结构体实例了- 所以
res[i].x直接访问的就是结构体里的int类型成员,完全不需要再用*去解引用——*只能作用在指针变量上,给普通int变量加*当然会报错
另外你的代码还有个隐藏bug:main函数里的for循环条件写的是i=n/2,这是赋值操作,不是比较!这样循环要么只执行一次,要么直接不执行,完全不符合你的需求,得改成i < n/2才对。
最后咱们还要注意内存管理:用malloc分配的内存,程序结束前记得用free释放,避免内存泄漏;另外最好加个malloc分配成功的检查,防止空指针问题。
修正后的完整代码
// 寻找和为给定数n的数对的程序 // 示例:输入:8;输出:(1,7) (2,6) (3,5) (4,4) // 输入:11;输出:(1,10) (2,9) (3,8) (4,7) (5,6) #include<stdio.h> #include<stdlib.h> typedef struct { int x; int y; } couple; couple* sums(int n) { int i; int count = n / 2; couple *c = (couple*) malloc(sizeof(couple) * count); // 检查内存分配是否成功 if (c == NULL) { printf("内存分配失败\n"); exit(1); } for (i = 0; i < count; i++) { c[i].x = i + 1; c[i].y = n - i - 1; } return c; } int main() { int n, i; couple *res; printf("请输入n的值:"); scanf("%d", &n); res = sums(n); // 修正循环条件为比较运算符 for (i = 0; i < n/2; i++) { // 去掉多余的*,直接访问结构体成员 printf("(%d,%d) ", res[i].x, res[i].y); } // 释放动态分配的内存 free(res); printf("\n"); return 0; }
关键知识点回顾
- 指向结构体的指针访问成员有两种常用方式:
- 单结构体指针:
指针->成员(比如res->x,当res指向单个结构体时) - 结构体数组指针:
指针[index].成员(比如res[i].x,等价于(*(res+i)).x,数组下标写法更直观)
- 单结构体指针:
- 解引用
*仅适用于指针类型变量,普通值类型(如int、char)不能使用* - 循环条件一定要用比较运算符(<、<=等),别误写成赋值运算符
=
内容的提问来源于stack exchange,提问作者Sam_mb_98
相关产品推荐
相关产品推荐

