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

C语言动态矩形矩阵遍历崩溃排查:行数小于列数时内存访问错误

动态内存矩阵访问崩溃问题排查与修复

问题概述

使用C语言指针在动态内存创建矩阵,填充随机数并打印时,当行数小于列数程序崩溃,返回错误码0xC0000005(内存访问冲突)。调试发现当i=0、j=2时,**(matrix + 2)无法访问内存,但方形矩阵或行数大于列数时运行正常。

原问题代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>

int main()
{
    int rows = 2;
    int cols = 3;
    int **matrix = malloc(sizeof(int*) * rows); // 为矩阵指针数组分配内存

    for(int i=0;i<rows;i++)
        *(matrix+i) = malloc(sizeof(int) * cols); // 为每行分配列内存

    // 生成随机数填充矩阵
    srand(time(NULL));

    for(int i=0;i<rows;i++)
        for(int j=0;j<cols;j++)
            *(*(matrix+j)+i) = rand() % 20;

    // 打印矩阵
    printf("{\t");
    for(int i=0;i<rows;i++)
    {
        int j;

        if(i>0)
            printf("\t");
        printf("{\t");

        for(j=0;j<cols;j++)
            printf("%d\t",*(*(matrix + j) + i));

        printf("}");
        if(i<rows-1)
            printf("\n");
    }
    printf("\t}\n\n");

    // 释放矩阵内存
    for(int i=0;i<rows;i++)
        free(matrix[i]);

    free(matrix);
    matrix = NULL;

    return 0;
}

问题根源

你分配的是rows行cols列的矩阵:

  • matrix是一个包含rows个int*的指针数组,每个元素指向一块容纳cols个int的内存
  • 但在填充和打印时,错误使用了*(*(matrix+j)+i)(等价于matrix[j][i]),把行下标和列下标搞反了
  • 当j >= rows时(比如测试用例中rows=2,j=2),matrix[j]超出了指针数组的边界,指向未分配的内存,直接访问会触发内存冲突

方形矩阵时rows=cols,j的最大值刚好等于rows-1,不会越界;行数大于列数时,j的最大值小于rows,也不会越界,所以这两种情况能正常运行。

修复后的代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>

int main()
{
    int rows = 2;
    int cols = 3;
    int **matrix = malloc(sizeof(int*) * rows);

    for(int i=0;i<rows;i++)
        *(matrix+i) = malloc(sizeof(int) * cols);

    srand(time(NULL));

    // 修正下标:matrix[i][j] 对应第i行第j列
    for(int i=0;i<rows;i++)
        for(int j=0;j<cols;j++)
            *(*(matrix+i)+j) = rand() % 20;

    printf("{\t");
    for(int i=0;i<rows;i++)
    {
        int j;

        if(i>0)
            printf("\t");
        printf("{\t");

        // 同步修正打印时的下标
        for(j=0;j<cols;j++)
            printf("%d\t",*(*(matrix + i) + j));

        printf("}");
        if(i<rows-1)
            printf("\n");
    }
    printf("\t}\n\n");

    // 释放内存逻辑不变
    for(int i=0;i<rows;i++)
        free(matrix[i]);

    free(matrix);
    matrix = NULL;

    return 0;
}

说明

修复了填充循环和打印循环中的下标顺序,确保matrix[i]始终访问的是有效行指针(范围0~rows-1),不会触发内存越界访问。

内容的提问来源于stack exchange,提问作者Frank S.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 10:13:08