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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:48:53