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

二维数组动态内存分配问题:对角线求和数组无法正确赋值

二维矩阵对角线和计算异常的原因与修复

我用指向指针的指针分配了N×N的二维矩阵,填充随机值后,创建了长度为2*N-1的一维数组来存储所有对角线的和,但写入值时结果不正确。以下是我的完整代码:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main() {
    srand(time(NULL));
    int N, ** matrix = NULL;
    printf("Input the number of rows\n");
    scanf_s("%d", &N);
    printf("\n");
    // Memory allocation for the array of pointers to pointers
    
    matrix = (int**) malloc(sizeof(int*) * N);
    if (matrix != NULL)
    {
        for (int i = 0; i < N; i++)
            *(matrix + i) = (int*)malloc(sizeof(int) * N);

        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; j++)
            {
                matrix[i][j] = rand() % 14 - 4;
                printf("%d\t", matrix[i][j]);
            }
            printf("\n");
        }
        printf("\n");

        int diag = 2 * N - 1;
        int *diagonals = NULL;
        diagonals = (int*)malloc(sizeof(int) * diag);

            for (int i = 0; i < N; i++)
            {
                for (int j = 0; j < N; j++)
                {
                    diagonals[i+j] += matrix[i][j];;
            }
        }

            for (int i = 0; i < diag; i++) {
                printf("diagonals[%d] - %d\n",i, *(diagonals+i));
        }

    }
    else
        printf("Not enough memory.. oops..\n");
}

问题根源

核心问题是动态分配的内存未初始化:

  • malloc仅分配内存空间,不会对内存内容做初始化,因此diagonals数组的每个元素都是随机垃圾值。
  • 代码中使用diagonals[i+j] += matrix[i][j],相当于用垃圾值与矩阵元素相加,最终结果自然错误。

修复方案

方案1:用calloc替代malloc

calloc在分配内存时会自动将所有字节初始化为0,直接解决未初始化问题:

int *diagonals = calloc(diag, sizeof(int));

方案2:手动初始化数组

如果坚持使用malloc,分配后手动循环将每个元素设为0:

int *diagonals = malloc(sizeof(int) * diag);
if (diagonals != NULL) {
    for (int i = 0; i < diag; i++) {
        diagonals[i] = 0;
    }
}

额外优化建议

  1. 避免内存泄漏:使用完动态分配的内存后必须释放,否则会造成内存泄漏。可在程序末尾添加释放逻辑:
// 释放矩阵每行内存
for (int i = 0; i < N; i++) {
    free(matrix[i]);
}
// 释放指针数组内存
free(matrix);
// 释放对角线数组内存
free(diagonals);
  1. 代码可读性优化:*(matrix + i)可替换为更直观的matrix[i],两者功能完全一致,但后者更易读。

修正后的完整代码

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

int main() {
    srand(time(NULL));
    int N, **matrix = NULL;
    printf("Input the number of rows\n");
    scanf_s("%d", &N);
    printf("\n");

    // 分配指针数组
    matrix = malloc(sizeof(int*) * N);
    if (matrix != NULL) {
        // 分配每行内存
        for (int i = 0; i < N; i++) {
            matrix[i] = malloc(sizeof(int) * N);
        }

        // 填充并打印矩阵
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                matrix[i][j] = rand() % 14 - 4;
                printf("%d\t", matrix[i][j]);
            }
            printf("\n");
        }
        printf("\n");

        int diag = 2 * N - 1;
        // 用calloc初始化内存为0
        int *diagonals = calloc(diag, sizeof(int));

        if (diagonals != NULL) {
            // 计算对角线和
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < N; j++) {
                    diagonals[i + j] += matrix[i][j];
                }
            }

            // 打印结果
            for (int i = 0; i < diag; i++) {
                printf("diagonals[%d] - %d\n", i, diagonals[i]);
            }

            // 释放对角线数组
            free(diagonals);
        }

        // 释放矩阵内存
        for (int i = 0; i < N; i++) {
            free(matrix[i]);
        }
        free(matrix);
    } else {
        printf("Not enough memory.. oops..\n");
    }

    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:10:24