C语言pq公式求解函数如何正确返回动态创建数组及报错解决
问题错误原因分析
1. arr[2]={{x1}, {x2}} 报错的核心原因
- 语法层面:C语言的花括号批量初始化语法仅能在数组定义时使用,不能用于数组定义后的赋值操作,编译器无法识别赋值语句右侧的花括号结构,因此抛出「expected an expression」错误。
- 逻辑层面:
- 你声明的
double *arr[]是指针数组,并非存储两个double值的动态数组指针,正确声明应该是double *arr; - 长度为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
相关产品推荐
相关产品推荐

