有人可以指出这个指向结构的指针的错误是什么?
简短的背景 - 我有一个叫做分数的结构,我有两个类型分数的变量(f1& f2)。我还有一个名为num的结构数组。到目前为止,这一切都运行良好,直到我尝试创建一个struct fraction类型的指针并为其指定f1的地址。
#include <stdio.h>
struct fraction
{
int nume;
int deno;
};
struct fraction *fp;
struct fraction f1,f2;
struct fraction num[3];
fp=&f1;
int main()
{
f1.nume=22;
f1.deno=7;
int i,x=5,y=6;
f2=f1;
printf("\n Fraction 1 numerator is: %d\n", f1.nume);
printf("\n Fraction 1 denominator is: %d\n", f1.deno);
printf("\n Fraction 2 numerator is: %d\n", f2.nume);
printf("\n Fraction 2 denominator is: %d\n", f2.deno);
//initialize array of structs
for(i=0;i<3;i++)
{
num[i].nume=x;
num[i].deno=y;
++x;
++y;
}
//print out array of structs
for(i=0;i<3;i++)
{
printf("\n Numerator of fraction num %d : %d", i, num[i].nume);
printf("\n Denominator of fraction num %d : %d\n", i, num[i].deno);
}
//try to use pointer to access field
printf("\n Numerator of fraction f1 : %d\n", fp->nume);
printf("\n");
}
我认为可以使用int,float等指针赋值的常规规则将指针分配给结构类型的变量。例如,你可以这样做:
int x=10;
int *y;
y=&x;
这将指针y指向变量x的地址。
然后,按照相同的逻辑,为什么上面的代码不起作用?我试图在线验证我的方法,从这篇eskimo.com文章中,它说的几乎是一样的。这是我得到的错误:
struct1.c:21:1: warning: type specifier missing, defaults to 'int'
[-Wimplicit-int]
fp=&f1;
^~
struct1.c:21:1: error: redefinition of 'fp' with a different type: 'int' vs
'struct fraction *'
struct1.c:17:18: note: previous definition is here
struct fraction *fp;
^
非常感谢您的帮助!
答案 0 :(得分:2)
struct fraction *fp;
struct fraction f1,f2;
fp=&f1;
确实类似于
int x=10;
int *y;
y=&x;
但是,您是否尝试在y=&x;
以外的任何函数之外使用后者fp=&f1;
?这不会编译,因为对于这两个例子来说,将作业放在那里是不合法的。
解决方案很简单:将fp=&f1;
放在函数中,例如main
。
答案 1 :(得分:1)
正如@Yu Hao建议您可以将fp=&f1;
放在函数中,例如main
或
您可以将代码更改为:
struct fraction f1,f2;
struct fraction *fp = & f1;
struct fraction num[3];