我有一個Struct,它存盤了一個檔案的名稱和它最后被訪問的日期。
typedef struct sFile {
int lastAccess。
char name[50] 。
} 檔案。
typedef struct sNode {
檔案資訊。
struct sNode* left;
struct sNode* right;
} 節點。
我編了一個函式,可以遞回地洗掉訪問日小于某個數字的檔案。例如,當你呼叫這個函式并傳遞10作為引數時,所有訪問日小于10的檔案將被洗掉。
然而,我在執行該函式時遇到了問題,最終產生了一個記憶體訪問錯誤。
我相信我的插入和洗掉函式是正確的,但為了以防萬一,我將它們留在下面。
插入和洗掉函式:
void insert(Node **root, File value){
if(*root == NULL) {
Node *celula = getNode();
if(celula == NULL) {
printf("
ERRO:記憶體丟失。下載程式。
")。)
exit(1)。
}
celula->left = NULL;
celula->right = NULL;
celula->資訊=價值。
*root = celula ;
} else {
if(strcmp(value.name, (*root)-> info.name) < 0) {
insert(&(*root)->left, value)。
} else {
insert(&(*root)->right, value);
}
}
};
Node* deleteNode(Node *root, char name[50]){
if (root == NULL)
return root。
if (strcmp(name, root-> info.name) < 0)
root->left = deleteNode(root->left, name);
else if (strcmp(name, root-> info.name) > 0)
root->right = deleteNode(root->right, name)。
else {
if (root->left == NULL) {
Node *temp = root->right;
free(root)。
return temp;
}
else if (root->right == NULL) {
Node *temp = root->left;
free(root)。
return temp;
}
Node *temp = minValueNode(root->right);
root->info = temp->info;
root->right = deleteNode(root->right, temp->info.name)。
}
return root。
}
樹的清理功能:
Node* clear(Node *root, int date) {
if(root == NULL) {
return NULL;
}
if(root->info.lastAccess <=date) {
root = deleteNode(root, (root)->info.name)。
}
root = clear(root->left, date);
root = clear(root->right, date);
return root。
}
錯誤資訊:
[1] 39970分段 fault (core dumped) ./7.out
有沒有人知道是什么原因導致了這個錯誤,以及我怎樣才能解決這個問題?
uj5u.com熱心網友回復:
我建議運行valgrind、gdb等來嘗試并找出錯誤的確切位置,但在沒有這些資訊的情況下,我可以在這里看到一個可能的NULL解除參考。
如果root->left和root->right都是NULL,那么deleteNode將回傳NULL,然后被clear(root->left, date)的呼叫所解讀。
看看在這里插入一個 NULL 的檢查是否會使它不再發生 segfault。
還是那句話,在這里無法判斷是否是這個原因造成的,請同時提供其余的代碼以使其可以運行,或者對其進行除錯以找出造成segfault的那一行。
uj5u.com熱心網友回復:
我能夠找到這個錯誤。感謝每個人的幫助。
我向樹的根部回傳了NULL,所以我失去了所有的樹參考,并因此進行了一次不恰當的記憶體訪問。我將清除函式更新為:
Node* clear(Node *root, int date){
if(root == NULL) {
return NULL;
}
if(root->info.lastAccess <=date) {
root = deleteNode(root, (root)->info.name)。
}
root->left = clear(root->left, date);
root->right = clear(root->right, date)。
return root。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/319288.html
標籤:
上一篇:為什么我得到的是一個空串列?
