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