两段相似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
相关产品推荐
相关产品推荐

