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

C语言动态数组函数调用后值异常:为何输出随机数?

问题根源:C语言的指针值传递陷阱

这是个很典型的C语言指针使用误区,咱们来一步步理清楚问题出在哪:

先看第一种写法为什么正常

在第一个main函数里,你调用addEntity(&entities, 1)时,传递的是指向entities指针的指针(二级指针)。addEntity函数内部通过*array = temp修改的是main函数里的原始entities变量,让它指向了新分配的、大小为2的内存块。所以后续修改entities[0]和entities[1]都是在合法的内存范围内操作,自然能得到预期结果。

第二种写法的问题出在哪

当你把操作封装到addEntityAndSetValues函数后,这个函数的参数是Entity* entities——这是值传递!也就是说,main函数调用它时,会把自己的entities指针值复制一份,给函数内部的局部变量entities用。

接下来你在函数里调用addEntity(&entities, 1),这里修改的只是函数内部那个局部的entities指针,完全和main函数里的原始指针没关系!等函数执行完返回main后,main里的entities还是指向最初malloc的、大小为1的内存块。

这时候你去访问entities[1],本质是越界访问内存,属于未定义行为,输出随机数就是这个原因(甚至程序可能直接崩溃)。

修复方案

要让函数能修改main里的指针变量,必须把addEntityAndSetValues的参数改成二级指针,就像addEntity那样:

void addEntityAndSetValues(Entity** entities) {
    // 直接传递二级指针给addEntity,不用再取局部变量的地址
    addEntity(entities, 1);
    // 访问数组元素时,先解引用二级指针得到数组指针,再索引
    changeValue(&(*entities)[0], 10);
    changeValue(&(*entities)[1], 20);
}

然后在main函数里调用时,要传递指针的地址:

addEntityAndSetValues(&entities);

这样修改后,addEntity对指针的修改就会同步到main函数的entities变量里,后续访问数组元素就是合法的,就能得到预期的10和20了。

关键知识点回顾

C语言里所有参数都是值传递:

  • 如果要修改一个普通变量(比如int),需要传递它的地址(一级指针)
  • 如果要修改一个指针变量本身(比如让它指向新的内存),就需要传递它的地址(二级指针)

你最初的addEntity函数设计是正确的,只是在封装时没保持二级指针的传递逻辑,才导致了这个问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:51:11