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

C11中函数返回二维数组后main无法读取,出现0xC0000005错误求修正

问题分析与修改方案

你遇到的Process finished with exit code -1073741819 (0xC0000005)是Windows下的内存访问违规错误,根源有两个:

  • 函数enter_array()里的int a[2][2]是栈上的局部变量,函数执行完毕后,栈内存会被系统回收,返回这个地址属于非法内存访问,直接导致程序崩溃。
  • 类型不匹配:int** 和二维数组退化成的指针类型(int (*)[2])完全不兼容,强行赋值后,后续访问数组时会计算错误的内存地址,加剧问题。

下面给出两种可行的修改方案:

方案一:使用静态数组(简单快速,适合固定大小场景)

将局部数组改为静态存储类型,内存会保留在全局存储区,不会随函数结束释放;同时修正指针类型,保证类型匹配:

#include <stdio.h>

// 返回类型改为指向int[2]的指针,匹配二维数组的退化类型
int (*enter_array())[2]{
    static int a[2][2]; // 静态数组,内存持久化
    int row_id = 0;
    int element_id = 0;
    while (row_id < 2){
        while (element_id < 2){
            printf("Element number %d in row number %d:", element_id, row_id);
            scanf("%d", &a[row_id][element_id]);
            element_id++;
        }
        row_id++;
        element_id = 0;
    }
    return a;
}

int main() {
    int (*a)[2]; // 定义为指向int[2]的指针,与返回类型匹配
    a = enter_array();
    int row_id = 0;
    int element_id = 0;
    while (row_id < 2){
        while (element_id < 2){
            printf("%d ", a[row_id][element_id]);
            element_id++;
        }
        row_id++;
        element_id = 0;
        printf("\n");
    }
    return 0;
}

方案二:动态分配堆内存(更灵活,支持动态大小)

手动在堆上分配内存,避免栈内存回收的问题,同时用完后记得释放内存防止泄漏:

#include <stdio.h>
#include <stdlib.h> // 引入malloc、free的头文件

int** enter_array(){
    // 先分配2个行指针
    int** a = (int**)malloc(2 * sizeof(int*));
    for(int i=0; i<2; i++){
        // 每行分配2个int的内存
        a[i] = (int*)malloc(2 * sizeof(int));
    }

    int row_id = 0;
    int element_id = 0;
    while (row_id < 2){
        while (element_id < 2){
            printf("Element number %d in row number %d:", element_id, row_id);
            scanf("%d", &a[row_id][element_id]);
            element_id++;
        }
        row_id++;
        element_id = 0;
    }
    return a;
}

int main() {
    int** a = enter_array();
    int row_id = 0;
    int element_id = 0;
    while (row_id < 2){
        while (element_id < 2){
            printf("%d ", a[row_id][element_id]);
            element_id++;
        }
        row_id++;
        element_id = 0;
        printf("\n");
    }

    // 释放堆内存,避免泄漏
    for(int i=0; i<2; i++){
        free(a[i]);
    }
    free(a);
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:15:46