从函数返回动态创建的数组
returning dynamically created array from function
我正在尝试 return pq 公式的解作为动态创建的数组。
正确的方法是什么?
这是我的功能:
double *pq (double a, double b)
{
double x1=(-1)*(a/2)-sqrt((a/2)*(a/2)-b);
double x2=(-1)*(a/2)+sqrt((a/2)*(a/2)-b);
double *arr[]=(double *)malloc(2*sizeof(double));
arr[2]={{x1}, {x2}};
return arr;
}
此外,为什么我在 arr[2]={{x1}, {x2}};
上收到 'expected an expression' 错误?
我的主要功能:
int main ()
{
double *arr[2]={0}, a=0.00, b=0.00;
scanf("%lf %lf", a,b);
if ((a*a)-(b*a)>=0)
{
for (int i=0; i<2; i++)
{
arr[i] = pq(a,b);
}
}
else
{
printf("Es gibt keine reellen L4sungen.");
}
for (int i=0; i<2;i++)
{
printf("%lf", arr[i]);
}
return 0;
}
问题出在这一行
arr[2]={{x1}, {x2}};
arr[2] =
正在分配给数组的第 3 个元素,该元素超出范围。而且您不能使用该大括号语法来分配给这样的数组切片。相反
arr[0] = x1;
arr[1] = x2;
您不能初始化这样一个动态分配的数组en bloc。相反,依次为每个元素赋值。通过稍微重新排序您的函数,您甚至可以消除对中间(x1
和 x2
)变量的需要:
double *pq (double a, double b)
{
double *arr = malloc(2*sizeof(double)); // No need to cast!
arr[0] = (-1)*(a/2)-sqrt((a/2)*(a/2)-b);
arr[1] = (-1)*(a/2)+sqrt((a/2)*(a/2)-b);
return arr;
}
关于 malloc
函数的 return 值的转换,参见:Do I cast the result of malloc?
此外,您必须更改 main
函数的工作方式;不要声明本地数组并尝试在调用后分配数据;只需使用函数中的 'array' returned,因为元素的值已经存在:
int main ()
{
double a=0.00, b=0.00;
scanf("%lf %lf", &a, &b); // Note the address (&) operators!
if ((a*a)-(b*a)>=0)
{
double *arr = pq(a, b);
for (int i=0; i<2; i++)
{
printf("%lf", arr[i]);
}
free(arr); // Don't forget to free the memory!
}
else
{
printf("Es gibt keine reellen L4sungen.");
}
return 0;
}
而不是这些行
double *arr[]=(double *)malloc(2*sizeof(double));
arr[2]={{x1}, {x2}};
return arr;
你需要在函数内写pq
double *arr = malloc( 2 * sizeof( double ) );
if ( arr != NULL )
{
arr[0] = x1;
arr[1] = x2;
}
return arr;
并且在main
double *arr = NULL;
double a = 0.0, b = 0.0;
scanf("%lf %lf", &a, &b );
^^^^^^
if ((a*a)-(b*a)>=0)
{
arr = pq( a, b );
}
else
{
printf("Es gibt keine reellen L4sungen.");
}
if ( arr != NULL )
{
for (int i=0; i<2;i++)
{
printf( "%f", arr[i] );
^^^
}
}
free( arr );
我正在尝试 return pq 公式的解作为动态创建的数组。 正确的方法是什么? 这是我的功能:
double *pq (double a, double b)
{
double x1=(-1)*(a/2)-sqrt((a/2)*(a/2)-b);
double x2=(-1)*(a/2)+sqrt((a/2)*(a/2)-b);
double *arr[]=(double *)malloc(2*sizeof(double));
arr[2]={{x1}, {x2}};
return arr;
}
此外,为什么我在 arr[2]={{x1}, {x2}};
上收到 'expected an expression' 错误?
我的主要功能:
int main ()
{
double *arr[2]={0}, a=0.00, b=0.00;
scanf("%lf %lf", a,b);
if ((a*a)-(b*a)>=0)
{
for (int i=0; i<2; i++)
{
arr[i] = pq(a,b);
}
}
else
{
printf("Es gibt keine reellen L4sungen.");
}
for (int i=0; i<2;i++)
{
printf("%lf", arr[i]);
}
return 0;
}
问题出在这一行
arr[2]={{x1}, {x2}};
arr[2] =
正在分配给数组的第 3 个元素,该元素超出范围。而且您不能使用该大括号语法来分配给这样的数组切片。相反
arr[0] = x1;
arr[1] = x2;
您不能初始化这样一个动态分配的数组en bloc。相反,依次为每个元素赋值。通过稍微重新排序您的函数,您甚至可以消除对中间(x1
和 x2
)变量的需要:
double *pq (double a, double b)
{
double *arr = malloc(2*sizeof(double)); // No need to cast!
arr[0] = (-1)*(a/2)-sqrt((a/2)*(a/2)-b);
arr[1] = (-1)*(a/2)+sqrt((a/2)*(a/2)-b);
return arr;
}
关于 malloc
函数的 return 值的转换,参见:Do I cast the result of malloc?
此外,您必须更改 main
函数的工作方式;不要声明本地数组并尝试在调用后分配数据;只需使用函数中的 'array' returned,因为元素的值已经存在:
int main ()
{
double a=0.00, b=0.00;
scanf("%lf %lf", &a, &b); // Note the address (&) operators!
if ((a*a)-(b*a)>=0)
{
double *arr = pq(a, b);
for (int i=0; i<2; i++)
{
printf("%lf", arr[i]);
}
free(arr); // Don't forget to free the memory!
}
else
{
printf("Es gibt keine reellen L4sungen.");
}
return 0;
}
而不是这些行
double *arr[]=(double *)malloc(2*sizeof(double));
arr[2]={{x1}, {x2}};
return arr;
你需要在函数内写pq
double *arr = malloc( 2 * sizeof( double ) );
if ( arr != NULL )
{
arr[0] = x1;
arr[1] = x2;
}
return arr;
并且在main
double *arr = NULL;
double a = 0.0, b = 0.0;
scanf("%lf %lf", &a, &b );
^^^^^^
if ((a*a)-(b*a)>=0)
{
arr = pq( a, b );
}
else
{
printf("Es gibt keine reellen L4sungen.");
}
if ( arr != NULL )
{
for (int i=0; i<2;i++)
{
printf( "%f", arr[i] );
^^^
}
}
free( arr );