Java矩阵两种初始化方式导致结果异常的问题排查
问题根源与解决方案
核心问题
直接赋值引用会让matrix2和原matrix共享同一块内存:
- CASE1是创建独立新矩阵,
matrix2拥有自己的内存空间,修改它不会影响原矩阵; - CASE2的直接赋值操作(如
matrix2 = matrix)只是让matrix2成为原矩阵的别名,两者指向完全相同的内存区域。后续逻辑中修改matrix2时,原matrix的元素会被同步修改,导致你的if判断读到的是已修改后的值,而非初始状态的原矩阵数据,因此会在matrix[1][2]处错误触发条件。
动态创建独立副本(适配LeetCode场景)
由于LeetCode中矩阵大小不固定,无法硬编码初始化,需要动态遍历原矩阵,逐行逐元素复制生成独立的新矩阵:
C语言实现示例
// 假设已知矩阵行数rows和列数cols int** matrix2 = (int**)malloc(rows * sizeof(int*)); for (int i = 0; i < rows; i++) { matrix2[i] = (int*)malloc(cols * sizeof(int)); for (int j = 0; j < cols; j++) { matrix2[i][j] = matrix[i][j]; } }
Java语言实现示例
int rows = matrix.length; int cols = matrix[0].length; int[][] matrix2 = new int[rows][cols]; for (int i = 0; i < rows; i++) { System.arraycopy(matrix[i], 0, matrix2[i], 0, cols); }
通过这种方式创建的matrix2与原矩阵完全独立,修改它不会影响原matrix的初始数据,后续的条件判断就能基于原矩阵的原始值正确执行。
内容的提问来源于stack exchange,提问作者Deepak Kumar
相关产品推荐
相关产品推荐

