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

C++非动态二维数组跨函数引用方法咨询

非动态二维数组的函数间引用实现方案

你不需要必须在main函数中创建非动态二维数组,以下是几种可行的实现方式,附带完整示例代码:

1. 在main创建数组,通过参数传递给其他函数

这是最通用、低耦合的方式。注意传递二维数组时必须指定第二维的大小,编译器需要这个值来计算内存偏移。

#include <stdio.h>

// 接收二维数组并修改,第二维大小必须明确
void modify_arr(int arr[][3], int row_count) {
    for (int i = 0; i < row_count; i++) {
        for (int j = 0; j < 3; j++) {
            arr[i][j] += 10;
        }
    }
}

// 打印二维数组
void print_arr(int arr[][3], int row_count) {
    for (int i = 0; i < row_count; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int demo_arr[2][3] = {{1,2,3}, {4,5,6}};
    
    printf("修改前:\n");
    print_arr(demo_arr, 2);
    
    modify_arr(demo_arr, 2);
    
    printf("修改后:\n");
    print_arr(demo_arr, 2);
    
    return 0;
}

2. 使用全局数组

将二维数组声明为全局变量,所有函数可直接访问和修改。但要注意全局变量会提高代码耦合度,不建议在大型项目中滥用。

#include <stdio.h>

// 全局非动态二维数组,编译期确定大小
int global_arr[2][3] = {{10,20,30}, {40,50,60}};

void modify_global() {
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            global_arr[i][j] *= 2;
        }
    }
}

void print_global() {
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", global_arr[i][j]);
        }
        printf("\n");
    }
}

int main() {
    printf("修改前全局数组:\n");
    print_global();
    
    modify_global();
    
    printf("修改后全局数组:\n");
    print_global();
    
    return 0;
}

3. 在函数内创建静态二维数组,返回指针

用static修饰数组,使其存储在静态存储区,函数结束后不会被销毁。这种方式适合需要在特定函数内初始化数组,且只需要一个实例的场景。

#include <stdio.h>

// 返回静态二维数组的指针,类型为指向int[3]的指针
int (*create_static_arr())[3] {
    static int static_arr[2][3] = {{1,1,1}, {2,2,2}};
    return static_arr;
}

void modify_static(int (*arr)[3], int row_count) {
    for (int i = 0; i < row_count; i++) {
        for (int j = 0; j < 3; j++) {
            arr[i][j] += 5;
        }
    }
}

int main() {
    int (*my_arr)[3] = create_static_arr();
    
    printf("修改前:\n");
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", my_arr[i][j]);
        }
        printf("\n");
    }
    
    modify_static(my_arr, 2);
    
    printf("修改后:\n");
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", my_arr[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

常见报错原因

  • 传递二维数组时未指定第二维大小:C语言要求必须明确第二维长度,否则编译器无法定位元素位置。
  • 返回栈上的普通数组:函数内的非静态数组存储在栈中,函数返回后内存被释放,后续访问会触发未定义行为。
  • 类型不匹配:例如将二维数组指针错误地当作一维指针传递,导致编译报错或运行时错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:30:53