2D 向量的 C++ 问题:执行时,您的代码以非法的方式修改了内存
Posted
技术标签:
【中文标题】2D 向量的 C++ 问题:执行时,您的代码以非法的方式修改了内存【英文标题】:C++ issue with 2D vector: When executed, your code modified memory in a way that was illegal 【发布时间】:2020-09-16 06:50:36 【问题描述】:这是我第一次在 SO 中发布问题。我一直在一个程序中工作,该程序测试是否有四个相同值的连续数字。我使用 Visual Studio 作为我的 IDE,我的代码编译良好,问题是在我的课堂上,我们通过一个网站 (Pearson) 发布代码,该网站测试代码是否正确。给我的问题如下:“执行时,您的代码以非法的方式修改了内存。此问题的常见原因包括数组索引错误和指针操作 (*) 错误。”我对指针的理解非常低,但我的代码看不出有什么问题。
#include <iostream>
#include <vector>
using namespace std;
int row = 6;
int col = 7;
bool checkRow(vector<vector<int>> v)
int count = 0;
for (int i = 0; i < row; i++)
for (int j = 1; j < col; j++)
if (a[i][j - 1] == a[i][j])
count++;
else
count = 0;
if (count == 3)
return true;
count = 0;
return false;
bool checkCol(vector<vector<int>> v)
int count = 0;
for (int i = 0; i < row; i++)
for (int j = 1; j < col; j++)
if (a[j - 1][i] == a[j][i])
count++;
else
count = 0;
if (count == 3)
return true;
count = 0;
return false;
bool diagonalOne(vector<vector<int>> v)
int count = 0;
if (row < 4 || col < 4)
return false;
else
for (int k = 3; k < col; k++)
for (int i = 1, j = k; j > 0; i++, j--)
if (a[i][j - 1] == a[i - 1][j])
count++;
else
count = 0;
if (count == 3)
return true;
count = 0;
int i = 1;
int j = row - 1;
int k = 0;
count = 0;
for(int i = 1; row - i > 3; i++)
k = i;
for (j = col - 1; j - 1 > i; j--, k++)
if (a[k][j] == a[k + 1][j - 1])
count++;
else
count = 0;
if (count == 3)
return true;
count = 0;
return false;
bool diagonalTwo(vector<vector<int>> v)
int count = 0;
int i, j, k;
if (row < 4 || col > 4)
return false;
else
for (i = 1; i < col - i; i++)
k = 0;
for (j = i; j < row; j++, k++)
if (a[k][j] == a[k + 1][j + 1])
count++;
else
count = 0;
if (count == 3)
return true;
count = 0;
for (i = 0; i < row - 3; i++)
k = i;
for (j = 0; j + 1 < row - i; j++, k++)
if (a[k][j] == a[k + 1][j + 1])
count++;
else
count = 0;
if (count == 3)
return true;
cout << endl;
count = 0;
return false;
bool isConsecutiveFour(vector<vector<int>> & values)
if (checkRow(values) == true)
return true;
if (checkCol(values) == true)
return true;
if (diagonalOne(values) == true)
return true;
if (diagonalTwo(values) == true)
return true;
return false;
int main()
int i = 0;
int j = 0;
vector<vector<int>>a(row);
for (i = 0; i < row; i++)
a[i] = vector<int>(col);
for (j = 0; j < col; j++)
cin >> a[i][j];
for (i = 0; i < row; i++)
for (j = 0; j < col; j++)
cout << a[i][j] << " ";
cout << endl;
if (isConsecutiveFour(a) == true)
cout << "The array has consecutive fours" << endl;
else
cout << "The array does not have consecutive fours" << endl;
system("PAUSE");
return 0;
【问题讨论】:
首先观察:这不是导致无效内存访问的代码,因为它无法编译。您是否将未使用的v
与不存在的a
混淆了? (main
中有一个a
,但所有函数中只有一个v
)
【参考方案1】:
checkCol
函数内循环的界限是错误的,这就是发生分段错误的原因。做吧:
for (int i = 0; i < col; i++)
for (int j = 1; j < row; j++)
diagonalOne
函数也有同样的错误。做吧:
for (int k = 3; k < row; k++)
建议:避免使用 using namespace std
和 system("PAUSE")
,并熟悉 VS 中的调试器。
【讨论】:
以上是关于2D 向量的 C++ 问题:执行时,您的代码以非法的方式修改了内存的主要内容,如果未能解决你的问题,请参考以下文章