能否存储全局变量,无需调用deriv()即可在main函数中调用打印?
问题:无需调用函数直接获取全局变量结果是否可行?
用户提供的代码示例:
double a = 0.0; double *dxda1=&a; void cof(double x, double a, double b, double* y, double* dxda) { x = pow((a * b) / 4, 2); y = &x; *dxda = (a / 8) * pow(b, 2); } void deriv() { double x =0.0; double y = 0.0; double dxda = 0.0; double a = 50; double b = 78; cof(x, a, b, &y, &dxda); dxda1 = &dxda; } int main() { deriv(); printf("whatineed: %g \n", *dxda1); }
这段代码运行后能得到正确结果38025,但希望将结果存储为全局变量,无需调用deriv()函数就能在main()中打印该变量,是否可行?
解答
可行,但要先修正原代码里的严重问题:原代码中dxda1是全局指针,指向的是deriv()函数里的局部变量dxda,函数执行结束后局部变量会被销毁,此时dxda1变成野指针,访问它属于未定义行为——只是碰巧得到正确结果,实际写法完全不安全。
下面提供两种可靠的实现方案:
方案一:固定参数直接初始化全局变量
如果a和b是固定值(比如代码里的50和78),可以直接在全局变量声明时计算结果赋值,无需调用任何函数:
#include <stdio.h> #include <math.h> // 直接在全局初始化阶段计算结果 double global_dxda = (50.0 / 8) * pow(78.0, 2); int main() { printf("whatineed: %g \n", global_dxda); return 0; }
方案二:动态参数自动初始化全局变量
如果a和b需要动态确定,但仍想在main()执行前自动完成计算,可以用编译器扩展的构造函数特性(支持GCC、Clang等主流编译器),标记一个函数在程序启动时自动执行:
#include <stdio.h> #include <math.h> double global_dxda = 0.0; // 可根据需求动态调整a、b的值 double a = 50.0; double b = 78.0; // 该函数会在main()执行前自动运行 __attribute__((constructor)) void init_global_result() { global_dxda = (a / 8) * pow(b, 2); } int main() { printf("whatineed: %g \n", global_dxda); return 0; }
两种方案都能在main()中直接打印全局变量的结果,无需手动调用deriv()函数。
内容的提问来源于stack exchange,提问作者Amyle
相关产品推荐
相关产品推荐

