C ++中指向数组的奇怪行为

时间:2013-11-10 15:58:12

标签: c++ arrays pointers

我编写了这个程序,它使用递归来计算矩阵的行列式。 函数build_new_matrix(不是递归的)有问题,因为它改变了变量old_mat,虽然我看不出原因!

#include <iostream>
#include <cstring>
using namespace std; 

int * new_mat = new int[];
int calculate_det_small (int matrix [4]){     //calculate determinant of a 2x2 matrix
    int res = ((matrix[0])*(matrix[3]))-((matrix[1])*(matrix[2]));
    return res;
};

int * build_new_matrix (int* old_mat, int rows, int minor){  //return the minor of the matrix

    int l=0;
    for (int i=rows; i<(rows*rows); i++){
        cout<<old_mat[i]<<" ";
        if ((i-minor) % rows !=0){
            new_mat [l] = old_mat[i] ; ///////////////////error!!!!!!!!
            l++;
        }
    };
    return new_mat;
};

int calculate_det (int rows, int matrix[]) {  //calculate determinant of a bigger matrix
    int c,o;
    if (rows==2){
        return calculate_det_small (matrix);
    }
    else {
        int result=0;
        for (int i=0; i<rows;i++){

            int* cur_matrix = build_new_matrix(matrix,rows,i);
            if (i%2==0){
                 c = matrix[i];
                result+= ((matrix[i])*(calculate_det((rows-1),cur_matrix)));
            }
            else{
                 o =matrix[i];
                result-= ((matrix[i])*(calculate_det((rows-1),cur_matrix)));
            }
        };
    return result;
    }
};

void main(){

    int mat[16] = {1,2,3,4,5,6,7,8,9, 10, 11, 12, 10, 14 ,15, 16};

    int determinanta = calculate_det(4,mat);


}

2 个答案:

答案 0 :(得分:2)

因为,在第一次递归之后,old_mat指向与全局new_mat相同的数组;所以写new_mat会覆盖旧矩阵。如果你打算这样做,你需要在每个递归深度为新矩阵分配内存。

此外,new int[]没有意义,也不应该编译。您需要指定数组大小。

答案 1 :(得分:0)

int * new_mat = new int[];

这条线毫无意义。您使用零元素分配数组。那甚至可以编译吗?