2016-10-23 28 views
-4

我再次開始編碼,但我在FreeBSD 11發行版中運行此代碼時感到磕磕絆絆。該代碼崩潰與分段錯誤錯誤。調用main之前的簡單C++程序崩潰

#include <iostream> 


int is_array_sorted(int a[], int n) 
{ 
if(n==2 || n==1) 
    return 1; 
else if(a[n-1]<a[n-2]) 
    return 0; 
is_array_sorted(a,n-1); 
} 

int main() 
{ 
int a[] = {1,2,3,4} ; 
int ret = is_array_sorted(a,4); 

std::cout<<"sorted ->"<< ret <<std::endl; 
return 0; 
} 

所以,我建立這個使用

c++ file.cpp --std=c++14 -g3 

RAN和墜毀。

此外,我想通過在主符號處設置斷點來使用gdb進行調試。然而,它崩潰即使再給予「計劃與信號SIGKILL,非法指令終止。 程序不再存在。

請搞清楚我到底做錯了幫幫忙?

+6

'is_array_sorted'中的最後一個語句不會返回任何內容 - >未定義的行爲。 – user657267

回答

0

is_array_sorted函數原型返回一個int所以這就是它必須在所有代碼路徑做(一)

此致這樣做時n是一個或兩個,或者當兩個元素被檢查都失靈,但時他們是爲了。

在這種情況下,它會下降到最終聲明,並且不會返回int - 這是導致代碼崩潰的最可能原因。

變化是最後一行到:

return is_array_sorted (a, n-1); 

,然後再試一次。因爲它不必要地使代碼結構複雜化,所以我並不是那麼喜歡if ... return else ...學校的粉絲。

您的邏輯似乎也有不正確的情況,當n等於2時,返回「true」。通過陣列{5, 4},與兩個n,應該告訴你爲什麼這是一個壞主意。

一個更好的辦法固定這兩個問題,在我看來,會是這樣的:

int is_array_sorted (int a[], int n) { 
    if (n==1) 
     return 1; 
    if (a[n-1] < a[n-2]) 
     return 0; 
    return is_array_sorted (a, n-1); 
} 

(但是,即使你無視我的佈局建議,你還是應該解決這個問題n == 2)。


的(a)作爲每C++11 6.6.3 The return statement /2

流動關閉的功能的端部是相當於沒有值的返回;這會導致值返回函數中的未定義行爲。

+0

謝謝你的回答!我需要修改基礎知識:( – pixelr

+0

)奇怪的是調試器在甚至調用'is_array_sorted'之前甚至不會啓動main函數。沒有靜態的全局對象或OP代碼中可疑的任何東西。爲什麼GCC甚至會生成這樣的二進制文件? –

+0

@Christian,這是關於未定義行爲的事情,標準對可能發生的事情沒有限制。這對於執行格式化磁盤和播放某人笑的AVI文件是完全有效的:-) – paxdiablo