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

标签 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);


}

最佳答案

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

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

关于c++ - C++中指向数组的指针的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19891793/

相关文章:

c++ - GitHub 将文件开源到不同的 IDE

c++ - 为什么没有准确的C++反编译器?

c++ - G++ 是否足够聪明来优化它?

java - 二分查找--同一个数组中的 double 和整数

c - 程序集 : Returning 64 bits pointer address (nasm unix x64)

C#函数指针?

c++ - 如何将 boost::signals2::signal 连接到纯虚函数?

c - 如何将文本文件存储到 C 中的数组中

java - 更改数组中的值

c - 如何调试这段c代码