你的代碼有未定義的行爲,所以任何事情都可能發生,包括做你想要的。在Clang下,你沒有得到你預期的結果。
我做最小的改動,讓您的代碼編譯,並用不確定的行爲行使路徑:
struct Node { int key; Node *lchild; Node *rchild; };
Node *search(Node *head, int x){
if(head == nullptr) return nullptr;
else if(x == head->key) return head;
else if(x <= head->key) search(head->lchild, x);
else search(head->rchild, x);
}
Node a { 0, nullptr, nullptr };
Node b { 1, &a, nullptr };
int main() { search(&b, 0); }
鏘提醒您的代碼在默認情況下,並導致你的代碼時,脫落的結尾崩潰在-O0
功能:
$ clang++ -std=c++11 wszdwp.cpp
wszdwp.cpp:7:1: warning: control may reach end of non-void function [-Wreturn-type]
}
^
1 warning generated.
$ ./a.out
zsh: illegal hardware instruction (core dumped) ./a.out
鏗鏘的-fsanitize=undefined
,我得到這個:
$ clang++ -std=c++11 -w -fsanitize=undefined wszdwp.cpp && ./a.out
wszdwp.cpp:2:7: runtime error: execution reached the end of a value-returning function without returning a value
該代碼可能對您有用,因爲您的編譯器「有用地」在函數體的末尾放置了ret
指令(沒有填充返回值reigster,所以返回值可能會從先前的功能)。
這是未定義的行爲。出現工作是一個有效的選擇。 – chris
打開警告? –
@ShafikYaghmour,羞愧的問題標題是不是太有用的尋找作爲一個騙局。 – chris