执行停止在 push_back
Execution is halting at push_back
下面的 for 循环在第一个循环时停止执行,我不知道为什么。我已经通过在其中放置 couts 来计算它在 push_back 处停止。之前它是工作的,然后我尝试修改它,然后我做了 Ctrl-z 让它回到这个状态,现在它突然停止在 push_back 之前似乎没有。怎么回事?
#include <iostream>
#include <vector>
using namespace std;
void decode(int[], int, int[][2]);
void displayArray(int[], int);
int main()
{
const int SIZE = 12;
int test[SIZE-2] = {3,9,1,4,8,0,11,5,1,8};
int edgeList[SIZE-1][2];
for (int i = 0; i < SIZE -1; i++)
{
edgeList[i][0] = -1;
edgeList[i][1] = -1;
}
decode(test, SIZE, edgeList);
return 0;
}
void decode(int inputString[], int size, int edgeList[][2])
{
int** arrayC = new int*[size - 2];
for(int i = 0; i < size - 2; i++)
arrayC[i] = new int[2];
for (int i = 0; i < size -2 ; i++)
{
arrayC[i][0] = i+1;
arrayC[i][1] = inputString[i];
}
for (int i = 0; i < size - 2; i++)
{
displayArray(arrayC[i], 2);
}
for (int i = 0; i < size - 1; i++)
{
vector<int> currentCycle;
int *visited = new int[size - 2];
for(int j = 0; j < size - 1; j++)
{
visited[j] = 0;
}
bool repeat = false;
int currentIndex = i;
while(!repeat)
{
int curElem = arrayC[currentIndex][0];
if (!visited[curElem] && curElem != 0 && curElem != size - 1)
{
cout << curElem << endl;
currentCycle.emplace_back(curElem);
visited[curElem] = 1;
}
else
{
repeat = true;
}
currentIndex = arrayC[currentIndex][1] - 1;
if (currentIndex == -1 || currentIndex == size -2)
{
repeat = true;
currentCycle.push_back(-1);
}
}
for (int i = 0; i < currentCycle.size(); i++)
cout << currentCycle[i] << " ";
cout << endl;
delete visited;
}
}
void displayArray(int array[], int size)
{
for (int i = 0; i < size; i++)
{
cout << array[i] << " ";
}
cout << endl;
}
int *visited = new int[size - 2];
size
是 12。这分配了一个包含 10 个整数的数组:visited[0]
到 visited[9]
.
for(int j = 0; j < size - 1; j++)
此 for
循环使用 j
从 0 到 10 进行迭代。size - 1
是 11。因此,此循环中 j
的最后一个值是 10。
visited[j] = 0;
这最终会尝试将 visited[10]
设置为 0。
失败。 visited
数组太小。只有 visited[0]
到 visited[9]
有效。这会导致内存损坏和未定义的行为。
这可能是也可能不是所示代码中的唯一错误。这是使用 valgrind 轻松发现的第一个内存访问违规,这是一个很棒的静态内存分析工具,它会在内存损坏发生时立即停止该程序的执行,让我可以使用调试器进入程序,检查所有变量的值,并轻松识别问题所在。
值得花一些时间学习如何使用调试和诊断工具,例如这些工具。它们确实可以帮助您非常快速地找到自己代码中的错误。
代码的总体目的不是很清楚,所以正确的修复应该是什么并不明显,所以我在找到第一个 showstopper 后就停止了。正如我简要提到的那样,在修复此问题后,可能还会出现其他类似的问题。如果是这样,您应该能够像我一样找到它们,借助一些您可能已经拥有的有用工具的帮助。
下面的 for 循环在第一个循环时停止执行,我不知道为什么。我已经通过在其中放置 couts 来计算它在 push_back 处停止。之前它是工作的,然后我尝试修改它,然后我做了 Ctrl-z 让它回到这个状态,现在它突然停止在 push_back 之前似乎没有。怎么回事?
#include <iostream>
#include <vector>
using namespace std;
void decode(int[], int, int[][2]);
void displayArray(int[], int);
int main()
{
const int SIZE = 12;
int test[SIZE-2] = {3,9,1,4,8,0,11,5,1,8};
int edgeList[SIZE-1][2];
for (int i = 0; i < SIZE -1; i++)
{
edgeList[i][0] = -1;
edgeList[i][1] = -1;
}
decode(test, SIZE, edgeList);
return 0;
}
void decode(int inputString[], int size, int edgeList[][2])
{
int** arrayC = new int*[size - 2];
for(int i = 0; i < size - 2; i++)
arrayC[i] = new int[2];
for (int i = 0; i < size -2 ; i++)
{
arrayC[i][0] = i+1;
arrayC[i][1] = inputString[i];
}
for (int i = 0; i < size - 2; i++)
{
displayArray(arrayC[i], 2);
}
for (int i = 0; i < size - 1; i++)
{
vector<int> currentCycle;
int *visited = new int[size - 2];
for(int j = 0; j < size - 1; j++)
{
visited[j] = 0;
}
bool repeat = false;
int currentIndex = i;
while(!repeat)
{
int curElem = arrayC[currentIndex][0];
if (!visited[curElem] && curElem != 0 && curElem != size - 1)
{
cout << curElem << endl;
currentCycle.emplace_back(curElem);
visited[curElem] = 1;
}
else
{
repeat = true;
}
currentIndex = arrayC[currentIndex][1] - 1;
if (currentIndex == -1 || currentIndex == size -2)
{
repeat = true;
currentCycle.push_back(-1);
}
}
for (int i = 0; i < currentCycle.size(); i++)
cout << currentCycle[i] << " ";
cout << endl;
delete visited;
}
}
void displayArray(int array[], int size)
{
for (int i = 0; i < size; i++)
{
cout << array[i] << " ";
}
cout << endl;
}
int *visited = new int[size - 2];
size
是 12。这分配了一个包含 10 个整数的数组:visited[0]
到 visited[9]
.
for(int j = 0; j < size - 1; j++)
此 for
循环使用 j
从 0 到 10 进行迭代。size - 1
是 11。因此,此循环中 j
的最后一个值是 10。
visited[j] = 0;
这最终会尝试将 visited[10]
设置为 0。
失败。 visited
数组太小。只有 visited[0]
到 visited[9]
有效。这会导致内存损坏和未定义的行为。
这可能是也可能不是所示代码中的唯一错误。这是使用 valgrind 轻松发现的第一个内存访问违规,这是一个很棒的静态内存分析工具,它会在内存损坏发生时立即停止该程序的执行,让我可以使用调试器进入程序,检查所有变量的值,并轻松识别问题所在。
值得花一些时间学习如何使用调试和诊断工具,例如这些工具。它们确实可以帮助您非常快速地找到自己代码中的错误。
代码的总体目的不是很清楚,所以正确的修复应该是什么并不明显,所以我在找到第一个 showstopper 后就停止了。正如我简要提到的那样,在修复此问题后,可能还会出现其他类似的问题。如果是这样,您应该能够像我一样找到它们,借助一些您可能已经拥有的有用工具的帮助。