C语言可变参数函数返回数组遇报错:局部变量地址返回与指针解引用错误
问题分析与解决方案
1. 返回局部变量的警告根源及解决
你遇到的warning: function returns address of local variable是因为sum_avg是函数内部的局部数组,它存储在栈帧中。当函数执行完毕后,栈帧会被销毁,这块内存会被系统回收或覆盖,返回它的地址会得到一个悬空指针,后续访问这个指针指向的内容是未定义行为(可能输出垃圾值,甚至程序崩溃)。
两种可行的解决方式:
方式一:使用动态内存分配
通过malloc在堆上分配内存,堆内存不会随函数结束而销毁,注意使用完后要调用free释放内存,避免内存泄漏:
#include<stdio.h> #include<stdarg.h> #include<stdlib.h> double* summationandavg(int c ,...) { va_list lon; va_start(lon,c); // 堆上分配2个double的空间 double *sum_avg = malloc(sizeof(double) * 2); if (!sum_avg) { // 检查内存分配是否成功 va_end(lon); return NULL; } sum_avg[0] = 0.0; sum_avg[1] = 0.0; for(int x=0; x<c; x++){ sum_avg[0] += va_arg(lon,double); } sum_avg[1] = sum_avg[0]/c; va_end(lon); return sum_avg; } int main() { double* z = summationandavg(3, 4.0, 5.0, 6.0); if(z){ // 确保指针有效再访问 printf("%f , %f ", z[0], z[1]); free(z); // 释放堆内存 } system("pause"); return 0; }
方式二:让调用者提供结果数组
直接将结果数组作为参数传入函数,函数内部直接修改数组内容,无需返回指针,这种方式更安全,无需手动管理内存:
#include<stdio.h> #include<stdarg.h> void summationandavg(double result[2], int c ,...) { va_list lon; va_start(lon,c); result[0] = 0.0; result[1] = 0.0; for(int x=0; x<c; x++){ result[0] += va_arg(lon,double); } result[1] = result[0]/c; va_end(lon); } int main() { double result[2]; summationandavg(result, 3, 4.0, 5.0, 6.0); printf("%f , %f ", result[0], result[1]); system("pause"); return 0; }
2. 指针访问的语法错误解释
你写的*z[0]是错误的,原因是:
z是double*类型,z[0]等价于*(z + 0),已经是对指针的解引用操作,得到的是一个double类型的值。- 而
*运算符只能作用于指针类型,对double值使用*会触发invalid type argument of unary '*'错误。
所以正确的访问方式是直接用z[0]和z[1],它们已经是指针指向的数组元素值。
内容的提问来源于stack exchange,提问作者user84999
相关产品推荐
相关产品推荐

