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

为何简单矩阵函数运行时出现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:06:01