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

能否传递指向字面量的指针?如何免显式变量调用foo函数

解决方法:无需显式变量向foo传入常量5的地址

嘿,这个问题问得很实际——谁都不想为了传个常量多写几行变量声明对吧?先直接说结论:你写的foo(&(5))是不行的,因为5是一个右值(临时值),C语言里不允许直接对右值取地址。不过别担心,C99及以后的标准给我们提供了更优雅的解决方案:

方法1:使用复合字面量(Compound Literals)

复合字面量是C99引入的特性,它允许你直接创建一个匿名的左值对象,这样就能合法地取它的地址了。有两种写法都能实现你的需求:

写法A:直接创建数组字面量并传首地址

foo((int[]){5});

这里(int[]){5}创建了一个包含单个元素5的匿名int数组,数组名本身就是首元素的地址,刚好匹配foo的int*参数。

写法B:直接创建单个int的字面量并取地址

foo(&(int){5});

这种写法更直观:(int){5}创建了一个匿名的int对象(左值),然后我们对它取地址,完美符合你的需求。

方法2:用宏封装简化调用

如果需要多次这样传参,可以写个宏来让代码更简洁:

#define INT_LITERAL_ADDR(x) (&(int){x})

// 调用时直接用
foo(INT_LITERAL_ADDR(5));

重要注意事项

复合字面量的生命周期和它所在的作用域绑定:

  • 如果在函数内部使用复合字面量,它的生命周期只到当前代码块结束(比如函数返回、跳出if/for块)。
  • 所以绝对不要让foo保存这个地址并在后续调用中使用,否则会导致未定义行为(访问已经销毁的内存)。如果foo只是在调用期间读取这个地址的值,那完全没问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:50:26