如何修复代码中的“无效的内存引用”错误?

时间:2019-07-04 16:00:44

标签: c++

我正在为我的arduino项目开发一个迷宫求解器机器人。我希望我的机器人记住迷宫,然后找到最短的路径。当char数组的长度为3时,我一直遇到问题。

当长度为<= 3时出现问题,所以我尝试了不同的东西来制作一个特殊的案例,这就是if (strlen(a) > 3)在这里的原因。

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

int main()
{
    char a[] = "LLLBLLLRBLLBSRSRS";
    char b[200];

    while(strcmp(a, b) != 0) {
        strcpy(b, a); //sa verific daca se schimba sirul, daca nu inseamna ca a ajuns la minim
    for(int i = 0; i < strlen(a) - 2; i++)
    {
        if(a[i] == 'L' && a[i + 1] == 'B' && a[i + 2] == 'R') //if urile astea cauta combinatii de cate 3 miscari sa optimizezi drumul
        {
            a[i] = 'B';
            if (strlen(a) > 3) strcpy(a + i + 1, a + i + 3);
            else a[i + 1] = '\0';
        }

        else if(a[i] == 'L' && a[i + 1] == 'B' && a[i + 2] == 'S')
        {
             a[i] = 'R';
            if (strlen(a) > 3) strcpy(a + i + 1, a + i + 3);
             else a[i + 1] = '\0';

        }

        else if(a[i] == 'L' && a[i + 1] == 'B' && a[i + 2] == 'L')
        {
             a[i] = 'S';
            if (strlen(a) > 3) strcpy(a + i + 1, a + i + 3);
            else a[i + 1] = '\0';
        }

        else if(a[i] == 'S' && a[i + 1] == 'B' && a[i + 2] == 'L')
        {
             a[i] = 'R';
            if (strlen(a) > 3) strcpy(a + i + 1, a + i + 3);
            else a[i + 1] = '\0';
        }

        else if(a[i] == 'S' && a[i + 1] == 'B' && a[i + 2] == 'S')
        {
             a[i] = 'B';
            if (strlen(a) > 3) strcpy(a + i + 1, a + i + 3);
            else a[i + 1] = '\0';
        }

        else if(a[i] == 'R' && a[i + 1] == 'B' && a[i + 2] == 'L')
        {
             a[i] = 'B';
            if (strlen(a) > 3) strcpy(a + i + 1, a + i + 3);
            else a[i + 1] = '\0';
        }
    }
     cout << a << endl;
    }


    return 0;
}

这是输出:

LLSLLBRRSRS LLSLBRSRS 最小二乘 最低工资标准 LBS

,然后显示错误消息运行时错误(退出状态:139(无效的内存引用))。

目标是使最后一个输出为R,因为LBS表示R。 感谢您的关注!

1 个答案:

答案 0 :(得分:0)

无效的内存引用的原因在于循环条件:

for(int i = 0; i < strlen(a) - 2; i++)

您正在循环内访问a[i + 2],因此最后一次迭代必须在i < strlen(a) - 3处结束:

for(int i = 0; i < strlen(a) - 3; i++)

这只会解决您的内存问题。您仍然get LBS作为最后一个输出。