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