二维数组动态内存分配问题:对角线求和数组无法正确赋值
二维矩阵对角线和计算异常的原因与修复
我用指向指针的指针分配了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; } }
额外优化建议
- 避免内存泄漏:使用完动态分配的内存后必须释放,否则会造成内存泄漏。可在程序末尾添加释放逻辑:
// 释放矩阵每行内存 for (int i = 0; i < N; i++) { free(matrix[i]); } // 释放指针数组内存 free(matrix); // 释放对角线数组内存 free(diagonals);
- 代码可读性优化:
*(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
相关产品推荐
相关产品推荐

