我有一个程序
#include<stdio.h>
void int_frac(double a, long *int_part,double *frac_part)
{
*int_part = (long int)(a);
*frac_part = a - *int_part;
}
int main()
{
long int* ip;
double* fp;
double i = 1.2345467;
int_frac(i,&ip,&fp);
printf("%f = %ld + %f",i,*ip,*fp);
return 0;
}
我正在使用gcc编译器。 该程序出错:
期望long int *但参数的类型为long int **
和
预期的double *但参数类型为double **
为什么会出现此错误。
答案 0 :(得分:4)
编译器告诉您正在将long int**
传递到期望long int*
的位置。并且您正在将double**
传递给double*
。
编译器是正确的。您将ip
声明为long int*
,然后传递&ip
类型为long int**
的{{1}}。您使用fp
犯了同样的错误。
您所做的是声明两个指针ip
和fp
,但不会初始化指针。根本问题是你已经声明了指针但没有分配任何变量。如果int_frac
能够写入变量,则必须在某处分配这些变量。因此,您需要做的是声明两个值,并将这些值的地址传递给int_frac
。
您的代码应为:
int main()
{
long int ip; // allocates a variable
double fp; // as does this
double i = 1.2345467;
int_frac(i,&ip,&fp); // pass the addresses of ip and fp
printf("%f = %ld + %f",i,ip,fp);
return 0;
}
答案 1 :(得分:4)
您收到的错误是我认为的答案,因为您在long int**
预期long int*
时,ip
需要将long int ip
声明为int main()
{
long int ip;
double fp;
double i = 1.2345467;
int_frac(i,&ip,&fp);
printf("%f = %ld + %f",i,ip,fp);
return 0;
}
,如下所示:< / p>
{{1}}