c语言 - 使用指针,但发生错误(以退出代码3221225477终止)



使用指针,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_gcdp_lcm是 main 中值的副本。因此,当您设置它们时,只会修改副本以指向变量,而不是实际值。您应该在此处添加&或其他 *,但即使这样做也会给您带来错误。因为您尝试返回函数本地的result_gcdresult_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_gcdp_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);

最新更新