能否传递指向字面量的指针?如何免显式变量调用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
相关产品推荐
相关产品推荐

