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

C语言中可变参数函数的参数存储位置是哪里?

C语言可变参数的存储位置解析
  • 可变参数函数的所有参数(包括固定参数和可变部分)默认存在栈中。调用函数时,调用者会按照约定的调用栈规则把所有参数依次压入栈,函数通过va_start、va_arg这类宏直接访问栈上的参数数据,这一步根本不需要动态内存分配。

  • 你提到的“运行时确定内存大小需要动态分配”,是指如果要把可变参数的内容复制出来长期保存(比如存到数组里供函数返回后使用)的情况。这时候才需要用malloc这类动态分配函数,复制出来的这部分数据会存在堆上,但原参数本身还是在栈里。

举个实际代码例子:

#include <stdarg.h>
#include <stdlib.h>

// 将可变参数里的整数复制到堆上的数组
int* copy_var_args(int arg_count, ...) {
    int* arg_array = malloc(arg_count * sizeof(int));
    va_list args_ptr;
    va_start(args_ptr, arg_count);
    
    for (int i = 0; i < arg_count; i++) {
        arg_array[i] = va_arg(args_ptr, int); // 从栈上读取参数,复制到堆的数组
    }
    
    va_end(args_ptr);
    return arg_array;
}
  • 这里va_arg直接读取栈上的原始参数,而malloc分配的数组在堆上,用完记得用free释放。

简单总结:可变参数的原始数据存在栈里,不需要动态分配;只有当你需要额外保存参数副本且大小运行时才确定时,才会用到堆上的动态内存。

内容的提问来源于stack exchange,提问作者Zaratruta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 19:17:05