C语言双指针分配的二维Frac结构体数组传参后为何被修改
问题根本原因
C语言的所有参数均为值传递,你对参数传递的效果存在误解:
你传入addhalf的参数arr是Frac**类型的指针,参数传递时只会复制这个指针本身的值,函数内拿到的f和main里的arr是两个独立的指针,但它们指向的是完全相同的堆内存区域。
你在函数内执行f[i][j] = add(f[i][j], h);操作时,直接修改了该内存区域存储的Frac结构体数值,自然会同步影响到main中arr指向的内容。
你提到的“使用双指针方法分配内存”和“参数不会被修改”没有任何关联:双指针只是动态分配二维数组的一种实现方式,不会自动为你生成原数组的独立副本,所以不可能避免原数组被修改。
实现不修改原数组的方案
如果要让addhalf操作不影响原数组,需要在函数内部手动创建原数组的完整副本:
- 先分配和输入数组尺寸一致的
Frac**指针数组 - 逐行分配
Frac结构体内存,把原数组的所有元素值逐个拷贝到新数组 - 后续所有计算逻辑都在新数组上执行
- 函数退出前要记得释放副本占用的内存,避免内存泄漏
内容的提问来源于stack exchange,提问作者J. Linne
相关产品推荐
相关产品推荐

