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
相关产品推荐
相关产品推荐

