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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:06:04