从函数返回动态创建的数组

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。相反,依次为每个元素赋值。通过稍微重新排序您的函数,您甚至可以消除对中间(x1x2)变量的需要:

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 );