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

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;
}

关键细节解释

  1. 为什么不用二级指针?
    你的需求是修改数组里的元素,不是修改matrix指针本身的指向。只有当函数需要重新分配数组内存(比如扩容)时,才需要传递二级指针int **array,因为这时候要改变main里指针存储的地址。

  2. 内存检查的必要性
    calloc或malloc可能会分配失败(比如内存不足),返回NULL。如果不检查直接使用,会导致程序崩溃,所以这一步不能省。

  3. 内存释放
    堆内存不会自动回收,用完后必须用free释放,否则会造成内存泄漏,长期运行会耗尽系统内存。

对你示例代码的修正

你示例里的疑问点:

  • function(matrix? &matrix?):直接传matrix即可;
  • void function (*array? **array?):定义为void function(int *array)就足够,因为你要操作的是数组元素,而非指针本身。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:43:30