复合字面量
在C语言中,复合字面量(Compound Literal) 是C99标准引入的特性,允许直接在代码中创建匿名的数组、结构体、联合体等类型的实例,而无需先声明变量。它的主要用途是临时生成一个特定类型的值,可以直接用于赋值、函数参数传递等场景。
基本语法
(类型名){初始化列表};
- 类型名:可以是数组、结构体、联合体等类型。
- 初始化列表:用花括号
{}
包裹的初始化值。
示例与应用场景
1. 数组的复合字面量
// 传统方式:先定义数组变量
int arr1[] = {1, 2, 3};
func(arr1);
// 使用复合字面量:直接传递匿名数组
func((int[]){1, 2, 3});
2. 结构体的复合字面量
typedef struct {
int x;
int y;
} Point;
// 传统方式:先定义结构体变量
Point p1 = {10, 20};
print_point(p1);
// 使用复合字面量:直接传递匿名结构体
print_point((Point){10, 20});
3. 动态初始化
// 复合字面量允许运行时赋值
int a = 5, b = 10;
print_point((Point){a, b});
特点与注意事项
-
作用域与生命周期:
- 复合字面量在函数内部使用时,具有自动存储期(类似局部变量),在块结束时释放。
- 若在全局或静态上下文中使用,其生命周期为整个程序运行期间。
-
可修改性:
// 复合字面量的值可以修改 int *ptr = (int[]){1, 2, 3}; ptr[0] = 100; // 合法
-
不可返回指针:
int* get_ptr() { return (int[]){1, 2, 3}; // 错误!函数返回后该内存失效! }
优势
- 代码简洁性:无需定义临时变量,直接生成所需值。
- 提高可读性:在函数调用或赋值时直接初始化复杂类型。
总结
复合字面量是C99中一种高效的语法特性,适用于需要临时创建数组、结构体等复杂类型的场景。合理使用可以减少冗余代码,但需注意其生命周期以避免悬垂指针等问题。