在这种情况下如何正确地指定结构变量的指针?

时间:2014-11-03 10:41:49

标签: c pointers struct

有人可以指出这个指向结构的指针的错误是什么?

简短的背景 - 我有一个叫做分数的结构,我有两个类型分数的变量(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;
             ^

非常感谢您的帮助!

2 个答案:

答案 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];