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 stdsystem("PAUSE"),并熟悉 VS 中的调试器。

【讨论】:

以上是关于2D 向量的 C++ 问题:执行时,您的代码以非法的方式修改了内存的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中填充二维向量

c++中字符串向量的索引[关闭]

在使用矩阵进行计算时擦除 C++ 2d 向量行

将矩阵加载到 2D 向量 C++

C++,2D std::vector,我是不是需要明确保留和推回空向量?

C++ 如何制作二维向量函数?