C - 检测到堆栈粉碎

标签 c stack-smash matrix-decomposition

我需要对矩阵 A 实现一个非常简单的就地 LU 分解。我正在使用高斯消元法,我想用 3x3 矩阵对其进行测试。问题是,我一直收到 stack smashing 错误,我不知道为什么。我在我的代码中没有看到任何问题,它可以做到这一点。你有什么想法吗?

问题可能出在 Factorization block 中。


###My code:###
#include <stdio.h>

int main() {
    int n = 3; // matrix size

    int A[3][3] = {
        {1, 4, 7},
        {2, 5, 8},
        {3, 6, 10}
    };

    printf("Matrix A:\n");

    for( int i=0; i < n; i++ ) {
        for( int j=0; j < n; j++ ) {
            printf("%d ", A[i][j]);

            if ( j % 2 == 0 && j != 0 ) {
                printf("\n");
            }
        }
    }

    // FACTORIZATION    
    int k;
    int rows;
    for( k = 0; k < n; k++ ) {
        rows = k + k+1;
        A[rows][k] = A[rows][k]/A[k][k];
        A[rows][rows] = A[rows][rows] - A[rows][k] * A[k][rows];
        printf("k: %d\n", k);
    }

    printf("Matrix after decomp:\n");
    for( int i=0; i < n; i++ ) {
        for( int j=0; j < n; j++ ) {
            printf("%d ", A[i][j]);

            if ( j % 3 == 0 && j != 0 ) {
                printf("\n");
            }
        }
    }

    return 0;
}

最佳答案

您的错误很可能在这里:

rows = k + k+1;
A[rows][k] = A[rows][k]/A[k][k];
A[rows][rows] = A[rows][rows] - A[rows][k] * A[k][rows];

这意味着 rows 遍历值 1、3、5;然后用于访问只有三个元素的数组。这确实会溢出,因为其中唯一有效的偏移量是 1。

编辑:查看您的 Matlab 代码,它正在做一些完全不同的事情,因为 rows = k + 1:nrows 设置为一个小 vector ,然后使用它拼接矩阵,C 不支持作为原语的东西。您需要使用显式循环重新实现它和矩阵乘法 A(rows, k) * A(k, rows)

关于C - 检测到堆栈粉碎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28182167/

相关文章:

c - 指向结构递增的指针

c++ - 我们什么时候需要提及/指定数字文字的整数类型?

c - 迭代 int 指针时破坏堆栈

c - 为什么 "stack smashing detected"不是刷完马上出现?

c - 普通 int 上的 stdatomic.h 函数 - 产生未定义或实现定义的行为?

c - 大小为 8 的无效读/写

c - 利用缓冲区漏洞时从单独的函数返回地址

opencv - 从本质分解的稳定翻译

python - R 和 Python 中的 LU 分解结果不一致

python - python中五对角矩阵的Cholesky优化