Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指针从函数到函数的转移_C - Fatal编程技术网

C 指针从函数到函数的转移

C 指针从函数到函数的转移,c,C,我有一个问题,因为当从控制台加载数据时,一个bug突然出现。我认为通过函数传递指示器是一件棘手的事情,但我不知道如何修复它 #include<stdio.h> #include<stdlib.h> typedef struct rn{ int n; /**numerator**/ unsigned d; /**denomirator**/ } rationalNumber; typedef struct dot{ rationalNu

我有一个问题,因为当从控制台加载数据时,一个bug突然出现。我认为通过函数传递指示器是一件棘手的事情,但我不知道如何修复它

#include<stdio.h>
#include<stdlib.h>

typedef struct rn{
    int n;   /**numerator**/
    unsigned d;    /**denomirator**/
} rationalNumber;

typedef struct dot{
    rationalNumber x;
    rationalNumber y;
} point;

int gcd(int a, int b)
{
  if(b!=0)
    return gcd(b,a%b);

       return a;
}

void input(rationalNumber *a)
{
    int nwd;
    if (scanf("%d/%u",&(a->n), &(a->d)) == 1) a->d=1;
    else
    {
        nwd = abs(gcd(a->n, a->d));
        a->n = a->n/nwd;
        a->d = a->d/nwd;
    }


}

void load_point(point *a, void(*function)(rationalNumber *))
{
    function(&a->x);
    function(&a->y);

}

int main(void)
{

    rationalNumber *z;
    point *a;


    load_point(a, input);



return 0;
}


#包括
#包括
类型定义结构{
int n;/**分子**/
未签名的d;/**denomirator**/
}合理数量;
类型定义结构点{
有理数x;
合理数量y;
}点;
内部gcd(内部a、内部b)
{
如果(b!=0)
返回gcd(b,a%b);
返回a;
}
无效输入(合理数量*a)
{
国际西北部;
如果(scanf(“%d/%u”),&(a->n),&(a->d))==1)a->d=1;
其他的
{
nwd=abs(gcd(a->n,a->d));
a->n=a->n/nwd;
a->d=a->d/nwd;
}
}
空荷载点(点*a,空(*函数)(合理数量*)
{
函数(&a->x);
函数(&a->y);
}
内部主(空)
{
有理数*z;
第*a点;
加载点(a,输入);
返回0;
}
我收到以下消息:线程1:EXC\u BAD\u访问(代码=1,地址=0x0)


在这里:
if(scanf(“%d/%u)”,&(a->n),&(a->d))==1)a->d=1

您创建的指针不指向任何特定对象,然后将它们传递给函数,该函数从不初始化它们,为它们分配内存,并相信它们是有效的,但它们不是

请记住,
点*a
是指针,而不是分配

一个简单的解决方案是使用局部变量而不是指针:

int main(void)
{
    rationalNumber z;
    point a;

    load_point(&a, input);

    return 0;
}

您创建的指针不指向任何特定对象,然后将它们传递给函数,该函数从不初始化它们,为它们分配内存,并相信它们是有效的,但它们不是

请记住,
点*a
是指针,而不是分配

一个简单的解决方案是使用局部变量而不是指针:

int main(void)
{
    rationalNumber z;
    point a;

    load_point(&a, input);

    return 0;
}

还有更难的解决方案?因为这个小小的改变需要改变我的整个代码。在这里,我刚刚插入了一个没有work@MarianKowal:此答案的更改不需要更改整个代码。只需进行
main
中所示的更改。这将删除两个字符,如果您考虑到
rationalNumber*z
未被使用的事实,则删除一个字符,因此这无关紧要。@tadman我认为他需要修改他的加载点函数,因为您已经在向其传递地址。并不是说他原来的函数会像他预期的那样工作。@luci88filter该函数已经想要
point*a
,这正是它所能提供的。还有一个更难的解决方案?因为这个小小的改变需要改变我的整个代码。在这里,我刚刚插入了一个没有work@MarianKowal:此答案的更改不需要更改整个代码。只需进行
main
中所示的更改。这将删除两个字符,如果您考虑到
rationalNumber*z
未被使用的事实,则删除一个字符,因此这无关紧要。@tadman我认为他需要修改他的加载点函数,因为您已经在向其传递地址。并不是说他原来的函数会像他预期的那样工作。@luci88filter该函数已经想要
point*a
,这正是它所能提供的。