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

