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

如何高效调用接收数组的C函数(无需创建局部数组)及数组重新赋值的方法

如何高效调用接收数组的C函数(无需创建局部数组)及数组重新赋值的方法

嘿,这个需求我太懂了——不想额外声明局部数组,直接用字面量值调用函数对吧?其实C99标准里早就提供了完美的解决方案:复合字面量(Compound Literals),刚好能解决你的问题!

一、直接调用:用复合字面量传参

你原来的写法function({1,2,3})或者function([1,2,3])不符合C的语法规则,编译器没法识别这个匿名数组的类型。而复合字面量就是专门用来创建这种临时匿名对象的语法,针对数组的写法是(数组类型){初始化列表}。

所以你只需要把调用改成这样:

function((int[3]){1, 2, 3});

这个写法的原理是:编译器会自动创建一个临时的int[3]数组,用{1,2,3}初始化后,把数组指针传给function。这个临时数组的生命周期和当前代码块的局部变量一致,函数调用结束后会自动销毁,完全不用你手动管理内存。

二、进阶:复用临时数组并修改值

如果你需要在调用函数前后修改这个临时数组的值,还可以把复合字面量赋值给一个指针:

// 创建临时数组并绑定到指针
int *temp_arr = (int[3]){4, 5, 6};
// 第一次调用
function(temp_arr);
// 修改数组元素
temp_arr[1] = 10;
// 第二次调用,会输出修改后的值
function(temp_arr);

注意哦:这个指针只能在当前代码块(比如main函数里,或者某个if块里)使用,出了代码块后临时数组会被销毁,指针就变成野指针了,千万别再用!

三、完整代码示例

给你写个完整的可运行代码,直观感受下:

#include <stdio.h>

void function(int a[3]) {
    printf("数组元素:%d, %d, %d\n", a[0], a[1], a[2]);
}

int main() {
    // 直接用复合字面量调用,无需声明局部数组
    function((int[3]){1, 2, 3});
    
    // 复用临时数组并修改值
    int *temp_arr = (int[3]){4, 5, 6};
    function(temp_arr);
    temp_arr[1] = 10;
    function(temp_arr);
    
    return 0;
}

运行后输出:

数组元素:1, 2, 3
数组元素:4, 5, 6
数组元素:4, 10, 6

兼容性说明

只要你的编译器支持C99及以上版本(现在GCC、Clang、MSVC这些主流编译器都默认支持了),这个写法就完全没问题。如果是非常老旧的C90编译器,那可能还是得老老实实声明局部数组,但这种场景现在几乎碰不到了。

备注:内容来源于stack exchange,提问作者Raja Sekhar B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 08:48:09