Код ниже - это просто фрагмент моего настоящего кода. У меня есть двоичное дерево и я получаю узлы для вставки. Мне нужно что-то сделать со вставленным узлом и тремя узлами-предшественниками и 3 узлами-преемниками. Если узел не найден, searchNode возвращает NULL. Я хочу предотвратить поиск 7 узлов снова и снова. Поэтому я подумал о том, чтобы сместить их из-за разницы в значении ключа по сравнению с предыдущим значением ключа, если они достаточно близки.
Компилятор g cc дает мне это предупреждение:
"Reading invalid data from 'scope': the readable size is '28' bytes, but '32' bytes may be read."
в этой строке кода: scope[k] = scope[k + diff];
. Я предполагаю, что это потому, что область видимости [k + diff] может находиться за пределами определенного диапазона, но я не вижу, чтобы это происходило с указанным выше оператором if.
struct Node
{
long key;
struct Node* left;
struct Node* right;
int height;
};
struct Node* searchNode(struct Node* root, long key)
{
if (root == NULL || root->key == key) {
return root;
}
if (key < root->key)
return searchNode(root->left, key);
else
return searchNode(root->right, key);
}
int main(){
struct Node* scope[7];
int flag1 = 0;
int preKey = 0;
int diff = 0;
int xKey = 0;
struct Node* temp = NULL;
// Node inserted
temp = searchNode(tree, xKey);
if (flag1 == 0) { //for the first element checked
flag1 = 1;
SCOPE:;
preKey = temp->key;
scope[0] = searchNode(tree, xKey - 3);
scope[1] = searchNode(tree, xKey - 2);
scope[2] = searchNode(tree, xKey - 1);
scope[3] = temp;
scope[4] = searchNode(tree, xKey + 1);
scope[5] = searchNode(tree, xKey + 2);
scope[6] = searchNode(tree, xKey + 3);
}
else {
diff = temp->key - preKey;
if (diff > 6)
goto SCOPE;
else {
for (int k = 0; k < 7 - diff; k++) {
scope[k] = scope[k + diff];
}
for (int j = 7 - diff; j < 7; j++) {
scope[j] = searchNode(tree, temp->key + j - 3);
}
preKey = temp->key;
}
}
}