大家好,我正在通过一些黑客排名挑战来学习C ++,并且遇到了段错误。该程序应考虑矩阵的尺寸并计算两个对角线,然后将它们相加。我很确定错误在于2D数组如何传递给computeMainDiagonal和computeSecondaryDiagonal函数。谢谢您的帮助 !

int ComputeMatrixMainDiagonal(int matrixDimensions, int* matrix){
    int rowIndent = 0;
    int diagonalValue;

    for(int i = 0;i < matrixDimensions;i++){
        diagonalValue =+ (&matrix)[i][rowIndent];
        rowIndent++;
    }
    return diagonalValue;
}

int ComputeMatrixSecondaryDiagonal(int matrixDimensions, int* matrix){
    int rowIndent = matrixDimensions;
    int diagonalValue;

    for(int i = matrixDimensions;i > 0;i--){
        diagonalValue =+ (&matrix)[i][rowIndent];
        rowIndent--;
    }
    return diagonalValue;
}


int main() {
    int matrixDimension;
    int differenceAcrossSumsOfDiagonal;
    int matrixMainDiagonal;
    int matrixSecondaryDiagonal;

    int * matrixPointer;

    cin >> matrixDimension; //get matrix dimensions
    int matrix[matrixDimension][matrixDimension]; //declare new matrix
    for(int index = 0; index < matrixDimension;index++ ){ //populate matrix
        for(int i = 0; i < matrixDimension;i++){
            cin >> matrix[index][i];
        }
    }
    matrixMainDiagonal = ComputeMatrixMainDiagonal(matrixDimension,&matrix[matrixDimension][matrixDimension]);
    matrixSecondaryDiagonal = ComputeMatrixSecondaryDiagonal(matrixDimension,&matrix[matrixDimension][matrixDimension]);

    differenceAcrossSumsOfDiagonal = (matrixMainDiagonal + matrixSecondaryDiagonal);

    cout << differenceAcrossSumsOfDiagonal;

    return 0;
}

最佳答案

您的细分错误很可能是因为&matrix[matrixDimension][matrixDimension]并不代表您的意思。您的问题标题表明您认为这是一种按值传递数组的方法(尽管您为什么要这样做逃避了我的注意),但是按值传递与按引用传递是函数如何处理的问题被声明,而不是如何调用。

表达式&matrix[matrixDimension][matrixDimension]是矩阵第matrixDimension行的第matrixDimension个元素的地址。这超出了矩阵的范围,因为数组的最大索引比数组维数小1。即使您写了&matrix[matrixDimension - 1][matrixDimension - 1],也不会是您想要的。您需要数组的第一个元素的地址,即&matrix[0][0]或简单地称为matrix,尽管由于类型不同(对应于matrix元素的含义不同),它们是不等价的。

10-07 13:01