为何简单矩阵函数运行时出现read access violation错误?
问题分析与修复方案
你的程序触发read access violation崩溃,核心是指针类型不匹配和数组越界两个问题,具体拆解如下:
1. 指针类型不匹配导致地址计算错误
main中声明m为int **(二级指针),但malloc分配的是连续一维内存(返回int*类型),强行赋值给int**后,指针运算逻辑完全错误:- 对
int**执行m + i*n +j时,偏移量会按指针大小计算(如64位系统为8字节),但实际内存是按int(4字节)连续存储的,这会导致读写地址严重偏离预期,破坏内存结构。
- 对
- 修复:将
m的类型改为int*,或者按二级指针的规则正确分配内存。
2. 数组越界访问
show函数中j的循环条件为j <= n,但矩阵列索引范围是0到n-1,当j=n时会访问超出数组范围的内存,直接触发读访问错误。- 修复:将循环条件改为
j < n。
3. 额外问题:代码不完整
main中未调用read和show函数,也未释放malloc分配的内存,补充后才能完整运行。
修复后的完整代码(一维数组实现)
#include <stdio.h> #include <stdlib.h> void read(int *m, int n) { int i, j; for(i=0;i<n;i++) for (j = 0; j < n; j++) { printf("a[%d][%d]=", i, j); scanf("%d", (m + i * n + j)); } } void show(int *m, int n) { int i, j; for (i = 0; i < n; i++){ for (j = 0; j < n; j++){ printf("%d ", *(m + i * n + j)); } printf("\n"); } } int main() { int *m; int n; printf("Introduceti nr de linii si coloane:"); scanf("%d", &n); m = malloc(n*n * sizeof(int)); if(m == NULL){ printf("内存分配失败\n"); return 1; } read(m, n); show(m, n); free(m); return 0; }
如果需要用int**类型的非连续二维数组,可按以下方式分配内存:
int** m = malloc(n * sizeof(int*)); for(int i=0;i<n;i++){ m[i] = malloc(n * sizeof(int)); } // 此时read和show函数参数可保留int**,直接用m[i][j]访问元素即可
内容的提问来源于stack exchange,提问作者cat_mat_novice
相关产品推荐
相关产品推荐

