C++ 尝试访问C+;中多维数组的元素时出现分段错误+;

C++ 尝试访问C+;中多维数组的元素时出现分段错误+;,c++,algorithm,loops,for-loop,multidimensional-array,C++,Algorithm,Loops,For Loop,Multidimensional Array,我有一个二维数组和一个一维向量。 我的任务是写一个程序,分配给向量的第i个分量 矩阵第i行的第一个元素,如果该行中至少有一个负元素 第i行的最后一个元素(如果没有)。 这就是我所做的 for(int j=0;j

我有一个二维数组和一个一维向量。 我的任务是写一个程序,分配给向量的第i个分量

  • 矩阵第i行的第一个元素,如果该行中至少有一个负元素
  • 第i行的最后一个元素(如果没有)。 这就是我所做的
  • for(int j=0;j<4;i++){
    
    您在此处递增的变量错误。编译器警告拾取了该变量,您应该确保已启用警告


    通过在这个循环中增加
    i
    ,您正在访问数组外的值,从而导致分段错误。

    错误在这里
    for(int j=0;j<4;i++)
    。您的
    j
    不是递增的,而是递增的
    i
    。由于
    j
    不是递增的,
    i
    通过数组的边界递增。这就是分段错误的原因

    修复方法很简单,只需在此处用
    j
    交换
    i

    for(int j=0;j<4;j++)
    
    对于初学者,此标题中的声明

    #include <cmath>
    
    而是使用命名常量

    在这个for循环中

     for(int j = 0; j < 4; i++) {
                           ^^^
    
            bool rowHasNegNum = false;
            for(int j = 0; j < 4; j++) {
                if (matrix[i][j] < 0) {
                    rowHasNegNum = true;
                }
            }
    
    程序输出为

    1.3 1 7 63.3 
    
    如果只使用循环,那么程序可以按以下方式运行

    #include <iostream>
    #include <functional>
    #include<iterator>
    #include<algorithm>
    
    int main() 
    {
        const size_t N = 4;
        double matrix[N][N] = 
        {
            { 1.3, -5.0,  4.4,  3.0 }, 
            { 7.0,  4.0,  2.01, 1.0 }, 
            { 7.0, 12.3, -8.7,  9.0 }, 
            { 4.0,  1.0, 33.0, 63.3 }
        };
        
        double vector[N];
        
        size_t i = 0;
        
        for ( const auto &row :matrix )
        {
            using std::placeholders::_1;
            if ( std::any_of( std::begin( row ), std::end( row ), 
                              std::bind( std::less<>( ), _1, 0 ) ) )
            {
                vector[i++] = row[0];
            }
            else
            {
                vector[i++] = row[N-1];
            }
        }
        
        for ( const auto &item : vector )
        {
            std::cout << item << ' ';
        }
        std::cout << '\n';
        
        return 0;
    }
    
    #include <iostream>
    
    int main() 
    {
        const size_t N = 4;
        double matrix[N][N] = 
        {
            { 1.3, -5.0,  4.4,  3.0 }, 
            { 7.0,  4.0,  2.01, 1.0 }, 
            { 7.0, 12.3, -8.7,  9.0 }, 
            { 4.0,  1.0, 33.0, 63.3 }
        };
        
        double vector[N];
        
        for ( size_t i = 0; i < N; i++ )
        {
            bool rowHasNegNum = false;  
            
            for ( size_t j = 0; not rowHasNegNum && j < N; j++ )
            {
                rowHasNegNum = matrix[i][j] < 0;
            }
            
            vector[i] = rowHasNegNum ? matrix[i][0] : matrix[i][N-1];       
        }
        
        for ( const auto &item : vector )
        {
            std::cout << item << ' ';
        }
        std::cout << '\n';
        
        return 0;
    }
    
    #包括
    int main()
    {
    常数大小N=4;
    双矩阵[N][N]=
    {
    { 1.3, -5.0,  4.4,  3.0 }, 
    { 7.0,  4.0,  2.01, 1.0 }, 
    { 7.0, 12.3, -8.7,  9.0 }, 
    { 4.0,  1.0, 33.0, 63.3 }
    };
    双向量[N];
    对于(大小i=0;istd::cout unrelated,但是使用
    vector
    作为变量名是一个糟糕的主意。@KamilCuk非常感谢您,我更正了它,我的程序也按预期工作:)@M.a感谢您的建议,的确…@M.a强烈反对。它可以是一个完全合适的变量名。@M.a在这种情况下,问题显然是
    使用std命名空间
    ,不是使用完全合理的名称。谢谢,我的程序运行正常。如何启用警告?我正在使用联机compiler@ArmanGrigoryan根据使用的不同,您应该能够在可以添加
    -Wall
    的地方设置编译标志,这大致代表所有警告
     for(int j = 0; j < 4; j++) {
                           ^^^
    
            bool rowHasNegNum = false;
            for(int j = 0; j < 4; j++) {
                if (matrix[i][j] < 0) {
                    rowHasNegNum = true;
                }
            }
    
    #include <iostream>
    #include <functional>
    #include<iterator>
    #include<algorithm>
    
    int main() 
    {
        const size_t N = 4;
        double matrix[N][N] = 
        {
            { 1.3, -5.0,  4.4,  3.0 }, 
            { 7.0,  4.0,  2.01, 1.0 }, 
            { 7.0, 12.3, -8.7,  9.0 }, 
            { 4.0,  1.0, 33.0, 63.3 }
        };
        
        double vector[N];
        
        size_t i = 0;
        
        for ( const auto &row :matrix )
        {
            using std::placeholders::_1;
            if ( std::any_of( std::begin( row ), std::end( row ), 
                              std::bind( std::less<>( ), _1, 0 ) ) )
            {
                vector[i++] = row[0];
            }
            else
            {
                vector[i++] = row[N-1];
            }
        }
        
        for ( const auto &item : vector )
        {
            std::cout << item << ' ';
        }
        std::cout << '\n';
        
        return 0;
    }
    
    1.3 1 7 63.3 
    
    #include <iostream>
    
    int main() 
    {
        const size_t N = 4;
        double matrix[N][N] = 
        {
            { 1.3, -5.0,  4.4,  3.0 }, 
            { 7.0,  4.0,  2.01, 1.0 }, 
            { 7.0, 12.3, -8.7,  9.0 }, 
            { 4.0,  1.0, 33.0, 63.3 }
        };
        
        double vector[N];
        
        for ( size_t i = 0; i < N; i++ )
        {
            bool rowHasNegNum = false;  
            
            for ( size_t j = 0; not rowHasNegNum && j < N; j++ )
            {
                rowHasNegNum = matrix[i][j] < 0;
            }
            
            vector[i] = rowHasNegNum ? matrix[i][0] : matrix[i][N-1];       
        }
        
        for ( const auto &item : vector )
        {
            std::cout << item << ' ';
        }
        std::cout << '\n';
        
        return 0;
    }