我正试图用2D数组从boyer moore中实现坏字符规则,用于子字符串搜索,我遇到了这样的场景:我看到我的arr[0]与arr[1][0]重叠,这导致了问题。我试着浏览VS中的代码,如果我查看内存位置,它实际上显示了正确的值,但在打印时我不确定这种重叠是如何发生的。有人能帮我理解我做错了什么吗?
错误输出j的值为---0
新条目是---f 102 13
内部while循环--102 13
内部while循环--13-1//13的重叠是否发生y
# define ROWS 20
# define COLUMNS 1
int main(void)
{
string str = "firstcharacter";
int strlength = str.length();
int arr[ROWS][COLUMNS];
memset(arr, -1, sizeof(arr[0][0]) * ROWS * COLUMNS);
for (int i = 0; i < strlength; i++)
{
int j = 0;
bool flag = false;
// check till point previous character was inserted
while (arr[j][1] != -1)
{
// if previous character is already present
// just update value dont insert character
if (arr[j][0] == str[i])
{
flag = true;
break;
}
j++;
}
if (flag == true)
{
int value = strlength - i - 1;
arr[j][1] = value;
cout << " Old entry is --- " << str[i] << " " << arr[j][0] << " " << arr[j][1] << endl << endl;
}
else
{
int value = strlength - i - 1;
arr[j][0] = str[i];
arr[j][1] = value;
cout << " New entry is --- " << str[i] << " "<< arr[j][0] << " " << arr[j][1] << endl << endl;
}
for (int x = 0; x < strlength; x++)
{
cout << " Inside while loop -- " << arr[x][0] << " " << arr[x][1] << endl; // --- error case after first iteration only I see value overlapping
}
}
cout << endl << endl << endl << endl;
for (int i = 0; i < strlength; i++)
{
cout << " final table is " << arr[i][0] << " " << arr[i][1] << endl;
}
return 0;
}
因为COLUMNS
就是1
。ary[j][1]
和ary[j+1][0]
将指向相同的内存地址,尽管第一个在技术上是未定义的行为,因为[1]
下标超出范围,