C语言typedef struct用法及二次方程根存入自定义roots类型方法
一、C语言中typedef struct的使用方式
typedef struct的核心作用是给结构体类型起简洁别名,避免重复书写struct 结构体名的繁琐,主要有两种常见写法:
匿名结构体直接typedef
就像你代码里的写法,直接定义匿名结构体并赋予别名:typedef struct { double m, n; } roots;之后可直接用
roots作为类型名定义变量:roots my_roots; // 定义roots类型的变量 roots *p_roots; // 定义指向roots类型的指针这种写法适合不需要在结构体内部引用自身的场景(比如无需构建链表、树这类递归结构)。
带标签的结构体typedef
如果结构体需要在内部引用自身(比如链表节点),必须给结构体加标签后再typedef:struct Node { int value; struct Node *next; // 需用struct Node引用自身 }; typedef struct Node Node; // 给struct Node起别名Node后续即可用
Node替代struct Node:Node *head; // 定义链表头指针
二、二次方程根存入自定义roots类型的实现
你的代码存在两个核心问题:函数声明返回roots*但未返回有效指针;未处理判别式小于0的异常情况。以下是两种可行的实现方案:
方案1:动态分配内存返回指针
在函数内用malloc分配roots类型内存,计算根后赋值,最终返回指针。注意调用方需手动释放内存避免泄漏。
#include <math.h> #include <stdlib.h> #include <stdio.h> typedef struct { double m, n; } roots; roots *quadratic_formula(int a, int b, int c) { // 计算判别式,强制转double避免int溢出 double discriminant = (double)b*b - 4*a*c; // 判别式小于0,无实根,返回NULL if (discriminant < 0) { return NULL; } // 分配内存并检查是否成功 roots *result = (roots*)malloc(sizeof(roots)); if (result == NULL) { return NULL; } // 计算根并赋值 double sqrt_d = sqrt(discriminant); result->m = (-b + sqrt_d) / (2.0 * a); result->n = (-b - sqrt_d) / (2.0 * a); return result; } // 使用示例 int main() { roots *r = quadratic_formula(1, -3, 2); if (r != NULL) { printf("根1:%lf,根2:%lf\n", r->m, r->n); free(r); // 必须释放内存 } else { printf("无实根或内存分配失败\n"); } return 0; }
方案2:传入结构体指针修改内容
由调用方提前定义roots变量,将指针传入函数直接修改值,无需动态分配内存,避免泄漏风险。
#include <math.h> #include <stdio.h> typedef struct { double m, n; } roots; // 返回1表示计算成功,0表示无实根或参数无效 int quadratic_formula(int a, int b, int c, roots *result) { if (result == NULL) { return 0; } double discriminant = (double)b*b - 4*a*c; if (discriminant < 0) { return 0; } double sqrt_d = sqrt(discriminant); result->m = (-b + sqrt_d) / (2.0 * a); result->n = (-b - sqrt_d) / (2.0 * a); return 1; } // 使用示例 int main() { roots r; if (quadratic_formula(1, -3, 2, &r)) { printf("根1:%lf,根2:%lf\n", r.m, r.n); } else { printf("无实根\n"); } return 0; }
关键注意点
- 计算判别式时强制将
b*b转为double,避免大整数相乘导致的int溢出。 - 分母用
2.0 * a而非2*a,确保运算为浮点数除法,避免精度丢失。 - 方案1必须调用
free释放内存,否则会造成内存泄漏。
内容的提问来源于stack exchange,提问作者Igneous Chunk
相关产品推荐
相关产品推荐

