C语言中如何传入数组至函数并实现写入操作?
解决C语言跨函数操作动态数组的问题
我明白你为啥困惑了——C里的指针和数组总是容易绕晕,尤其是跨函数操作的时候。你的需求其实很直接:在main里创建动态数组,传给其他函数写入数据,返回main后还能访问修改后的内容。咱们一步步理清楚:
核心原理
你用calloc分配的是一块堆内存,matrix这个指针保存的是这块内存的起始地址。当你把这个指针传给函数时,函数会得到一个指针的副本,但这个副本指向的还是同一块堆内存。所以函数里通过这个指针修改数组元素,main里的原指针指向的内存也会跟着改变——根本不需要传&matrix(二级指针),除非你要在函数里改变matrix本身的指向(比如重新分配更大的内存)。
正确代码示例
#include <stdio.h> #include <stdlib.h> // 函数接收int类型指针(即动态数组的起始地址) void function(int *array) { // 直接通过指针操作数组元素,修改的是原堆内存的值 array[1] = 5; } int main() { int *matrix; // 分配10个int大小的内存,初始化为0 matrix = calloc(10, sizeof(int)); // 必须检查内存分配是否成功!避免空指针错误 if (matrix == NULL) { fprintf(stderr, "内存分配失败\n"); return 1; } // 直接传matrix(数组起始地址)给函数 function(matrix); // 现在main里可以读到函数修改后的值 printf("%d\n", matrix[1]); // 输出结果为5 // 别忘了释放堆内存,防止内存泄漏 free(matrix); matrix = NULL; // 好习惯,避免野指针 return 0; }
关键细节解释
为什么不用二级指针?
你的需求是修改数组里的元素,不是修改matrix指针本身的指向。只有当函数需要重新分配数组内存(比如扩容)时,才需要传递二级指针int **array,因为这时候要改变main里指针存储的地址。内存检查的必要性
calloc或malloc可能会分配失败(比如内存不足),返回NULL。如果不检查直接使用,会导致程序崩溃,所以这一步不能省。内存释放
堆内存不会自动回收,用完后必须用free释放,否则会造成内存泄漏,长期运行会耗尽系统内存。
对你示例代码的修正
你示例里的疑问点:
function(matrix? &matrix?):直接传matrix即可;void function (*array? **array?):定义为void function(int *array)就足够,因为你要操作的是数组元素,而非指针本身。
内容的提问来源于stack exchange,提问作者Martin Indrych
相关产品推荐
相关产品推荐

