如何高效调用接收数组的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
相关产品推荐
相关产品推荐

