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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:20:33