使用指针,GCD和LCM使用单个函数和指针进行求解。我还不习惯指针。无论如何,我写了下面的代码。但是,诸如以退出代码终止:之类的错误3221225477继续出现。根据互联网上的搜索,上面的退出代码是由于不正确的内存引用。但我不知道哪一部分是错的。
#include <stdio.h>
void gcdlcm(int a, int b, int* p_gcd, int* p_lcm){
int tmp, n, result_gcd, result_lcm;
int gcd_a, gcd_b;
p_gcd = &result_gcd;
p_lcm = &result_lcm;
if(a < b){
tmp = a;
a = b;
b = tmp;
}
gcd_a = a;
gcd_b = b;
if(gcd_b == 0){
result_gcd = 0;
}
while (gcd_b != 0)
{
n = gcd_a % gcd_b;
gcd_a = gcd_b;
gcd_b = n;
}
result_gcd = gcd_a;
printf("result_gcd = %dn", result_gcd);
result_lcm = a * b / result_gcd;
printf("result_lcm = %dn", result_lcm);
}
int main(){
int x, y;
int *p_gcd, *p_lcm;
scanf("%d %d", &x, &y);
gcdlcm(x, y, p_gcd, p_lcm);
printf("%d %d", *p_gcd, *p_lcm);
return 0;
}
在这里:
p_gcd = &result_gcd;
将局部变量更改为p_gcd
。这不会影响main
中的p_gcd
,从gcdlcm
返回后,它与以前具有相同的未定义值。取消引用它会导致您的异常。
我想将参数作为指针传递,以便您的函数可以填写正确的数据,您必须创建变量来保存数据,然后使用 address-of 运算符将指针传递给它们&
:
int gcd, lcm;
scanf("%d %d", &x, &y);
gcdlcm(x, y, &gcd, &lcm);
(顺便说一下,这与呼叫上方一行的scanf
功能完全相同。
在函数中,将结果分配给指针指向的内容:
*p_gcd = gcd_a;
这将通过指针p_gcd
修改main
中的变量gcd
。现在,从gcdlcm
返回后,gcd
具有所需的值。
错误就在这一行printf("%d %d", *p_gcd, *p_lcm);
. 原因是两者都会指向一些随机数据。
发生这种情况是因为您的函数将复制这些值。 函数中的p_gcd
和p_lcm
是 main 中值的副本。因此,当您设置它们时,只会修改副本以指向变量,而不是实际值。您应该在此处添加&
或其他 *,但即使这样做也会给您带来错误。因为您尝试返回函数本地的result_gcd
和result_lcm
的地址。并且他们的地址在函数结束后无效
解决此问题的最佳方法是(在我看来)在结构中返回两个值:
struct Result {
int gdc;
int lcm
};
struct Result gcdlcm(int a, int b){
//...
struct Result r;
r.gdc = result_gcd;
r.lcm = result_lcm;
return r;
}
如果您不喜欢该解决方案,则可以在 main 中使用指向变量的传递指针并在函数中设置它们:
void gcdlcm(int a, int b, int* p_gcd, int* p_lcm){
int tmp, n, result_gcd, result_lcm;
int gcd_a, gcd_b;
if(a < b){
tmp = a;
a = b;
b = tmp;
}
gcd_a = a;
gcd_b = b;
if(gcd_b == 0){
result_gcd = 0;
}
while (gcd_b != 0)
{
n = gcd_a % gcd_b;
gcd_a = gcd_b;
gcd_b = n;
}
result_gcd = gcd_a;
printf("result_gcd = %dn", result_gcd);
result_lcm = a * b / result_gcd;
printf("result_lcm = %dn", result_lcm);
*p_gcd = result_gcd;
*p_lcm = result_lcm;
}
int main(){
int x, y;
int p_gcd, p_lcm;
scanf("%d %d", &x, &y);
gcdlcm(x, y, &p_gcd, &p_lcm);
printf("%d %d", p_gcd, p_lcm);
return 0;
}
你声明了未初始化的指针:
int *p_gcd, *p_lcm;
具有不确定的值。
这些指针由您按值传递到函数:
gcdlcm(x, y, p_gcd, p_lcm);
该函数处理指针p_gcd
和p_lcm
值的副本。因此,更改副本不会影响原始指针。
因此,在语句中取消引用这些初始化指针:
printf("%d %d", *p_gcd, *p_lcm);
导致未定义的行为。
如果要更改函数中的原始指针,则需要通过引用传递它们。
在 C 中,通过引用传递意味着通过指向对象的指针间接传递对象。因此,取消引用指针,您将可以直接访问对象。
例如:
void gcdlcm(int a, int b, int **p_gcd, int **p_lcm){
int tmp, n, result_gcd, result_lcm;
int gcd_a, gcd_b;
*p_gcd = &result_gcd;
*p_lcm = &result_lcm;
//...
主要:
gcdlcm(x, y, &p_gcd, &p_lcm);