C99中按值返回栈分配结构体是否安全?
C99中按值传递栈分配结构体是否安全?
放心哈,C99完全保证这种操作是安全的,甚至从更早的C89标准开始就已经支持结构体按值传递了。
C标准明确规定:结构体类型属于可传递的对象类型,不管它是分配在栈上还是堆上,作为函数参数按值传递时,编译器会自动创建该结构体的完整副本,把这个副本放到函数的栈帧中。函数内部对参数的所有操作都是针对这个副本的,不会影响原来的结构体,完全不存在安全问题。
咱们举个实际的例子验证下:
#include <stdint.h> #include <stdio.h> typedef struct { int32_t upper; int32_t lower; } boundaries; // 按值接收结构体参数 void adjust_boundaries(boundaries b) { b.upper += 10; b.lower -= 10; printf("函数内的副本:upper=%d, lower=%d\n", b.upper, b.lower); } int main() { // 栈上分配的结构体 boundaries stack_bounds = {100, 20}; printf("传递前的原结构体:upper=%d, lower=%d\n", stack_bounds.upper, stack_bounds.lower); // 按值传递栈结构体 adjust_boundaries(stack_bounds); printf("传递后的原结构体:upper=%d, lower=%d\n", stack_bounds.upper, stack_bounds.lower); return 0; }
运行这段代码你会发现,函数内部修改的只是副本,原结构体的数据完全没被改动,这就是标准保证的行为。
另外补充下,C99还扩展了结构体的使用场景(比如允许在函数参数列表里直接定义匿名结构体),但按值传递结构体的核心机制是早就被标准明确保障的,完全不用担心安全问题。
内容的提问来源于stack exchange,提问作者fearless_fool
相关产品推荐
相关产品推荐

