You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言pq公式求解函数如何正确返回动态创建数组及报错解决

问题错误原因分析

1. arr[2]={{x1}, {x2}} 报错的核心原因

  • 语法层面:C语言的花括号批量初始化语法仅能在数组定义时使用,不能用于数组定义后的赋值操作,编译器无法识别赋值语句右侧的花括号结构,因此抛出「expected an expression」错误。
  • 逻辑层面:
    1. 你声明的double *arr[]是指针数组,并非存储两个double值的动态数组指针,正确声明应该是double *arr;
    2. 长度为2的数组合法下标是0和1,arr[2]本身已经是越界访问,不存在这个元素。

2. 其余代码的问题汇总

pq函数侧

  • 未预先判断判别式(a/2)*(a/2)-b的正负就直接调用sqrt,如果判别式为负会得到非法的nan值;
  • 动态内存申请后没有赋值逻辑,也没有错误处理(如果malloc失败返回NULL)。

主函数侧

  • scanf("%lf %lf", a,b) 传参错误,scanf需要传入变量地址,应该写为&a, &b;
  • 判别式计算错误,pq公式的实数解判断条件应该是(a/2)*(a/2)-b >= 0,你写的(a*a)-(b*a)逻辑完全错误;
  • double *arr[2]是指针数组,你循环两次调用pq相当于重复申请了两次动态内存,不仅逻辑冗余还会造成内存泄漏,调用1次pq就可以拿到两个解;
  • 打印时直接输出指针值arr[i],而非指向的浮点数值,输出结果错误。

正确实现代码

pq函数实现

#include <math.h>
#include <stdlib.h>

double *pq(double a, double b) {
    double discriminant = (a/2) * (a/2) - b;
    // 判别式为负无实根,返回NULL
    if (discriminant < 0) {
        return NULL;
    }
    // 申请存储两个double的动态数组
    double *arr = (double*)malloc(2 * sizeof(double));
    // 内存申请失败处理
    if (arr == NULL) {
        return NULL;
    }
    double sqrt_d = sqrt(discriminant);
    arr[0] = -a/2 - sqrt_d;
    arr[1] = -a/2 + sqrt_d;
    return arr;
}

主函数实现

#include <stdio.h>

int main () {
    double a = 0.0, b = 0.0;
    // 传入地址给scanf
    scanf("%lf %lf", &a, &b);
    
    double *res = pq(a, b);
    if (res == NULL) {
        printf("Es gibt keine reellen Lösungen.");
    } else {
        // 依次输出两个解
        printf("%lf\n%lf", res[0], res[1]);
        // 释放动态申请的内存,避免泄漏
        free(res);
    }

    return 0;
}

内容的提问来源于stack exchange,提问作者sirmeowsalot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 22:33:00