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

两段相似C语言代码修改结构体成员效果不同,是什么原因导致的?

两段C代码运行效果差异的原因

两段代码的核心差异是layer类型变量的定义方式,本质是C语言中值拷贝和指针引用的逻辑区别:


第一段赋值无效的代码

int i;
for(i = 0; i < net.n ; ++i){
    layer l = net.layers[i];
    if(l.type == CONVOLUTIONAL){
        //save_convolutional_weights(l, fp);
        l.weights_quant_multipler = 0;
    }
}

失效原因:

  • layer l = net.layers[i];执行的是值拷贝操作,会在当前栈空间创建一个layer类型的临时变量l,将net.layers[i]的所有成员值完整复制到这个临时变量中
  • 后续对l.weights_quant_multipler = 0的修改,仅作用于栈上的临时变量,不会修改net.layers数组中存储的原始数据
  • 每次循环结束后,当前迭代的临时变量l会被销毁,所有修改都不会留存,因此完全不会影响后续运行结果

第二段赋值生效的代码

int i;
for (i = 0; i < net.n; ++i) {
    layer *l = &net.layers[i];

    if (l->type == CONVOLUTIONAL) {

        l->weights_quant_multipler = 0;
    }
}

生效原因:

  • layer *l = &net.layers[i];定义的是layer类型的指针,直接指向net.layers数组中第i个元素的内存地址,没有发生数据拷贝
  • 后续通过l->weights_quant_multipler = 0的修改,是直接操作指针指向的原始内存地址中的数据,会直接修改net.layers数组中的实际存储内容
  • 修改会永久留存,因此会显著影响后续依赖该参数的运行逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:09:00