2014-11-25 50 views
-1

我是新來的C和此刻的我試圖調試我的代碼。我在這個特定的錯誤上遇到了死衚衕。它給我一個錯誤:EXC_BAD_ACCESS用C

THREAD 1:EXC_BAD_ACCESS(代碼= 2,地址= 0x7fff5fc00000)出現在部分KREC

誤差[0]。

我還沒有搞清楚什麼是允許在C和編寫C時,什麼是不允許。希望能有一些建議讓我的代碼更高效。這裏是我的代碼:

int k_vector_calculation(int krec[3]) 

{ 
    int Boxx[3], Boxy[3], Boxz [3]; 

    Boxx[0] = lx ; 
    Boxx[1] = 0 ; 
    Boxx[2] = 0 ; 

    Boxy[0] = 0 ; 
    Boxy[1] = ly ; 
    Boxy[2] = 0 ; 

    Boxz[0] = 0 ; 
    Boxz[1] = 0 ; 
    Boxz[2] = lz ; 

    int Productbc[3], Productac[3], Productab[3] ; 

    Productbc[0] = Boxy[1] * Boxz[2] ; 
    Productbc[1] = 0 ; 
    Productbc[2] = 0 ; 

    Productac[0] = 0 ; 
    Productac[1] = Boxx [0]* Boxz [2] ; 
    Productac[2] = 0 ; 

    Productab[0] = 0 ; 
    Productab[1] = 0 ; 
    Productab[2] = Boxx [0]* Boxy [1] ; 

    float V0 = 0; 

    V0 = lx*ly*lz ; 

    int u[3], v[3], w[3] ; 

    u[0] = 2*PI/V0*Productbc[0] ; 
    u[1] = 2*PI/V0*Productbc[1] ; 
    u[2] = 2*PI/V0*Productbc[2] ; 

    v[0] = 2*PI/V0*Productac[0] ; 
    v[1] = 2*PI/V0*Productac[1] ; 
    v[2] = 2*PI/V0*Productac[2] ; 

    w[0] = 2*PI/V0*Productab[0] ; 
    w[1] = 2*PI/V0*Productab[1] ; 
    w[2] = 2*PI/V0*Productab[2] ; 

    int l, m, o; 
    l = nearbyint(lx) ; 
    m = nearbyint(ly) ; 
    o = nearbyint(lz) ; 

    krec[0] = l*u[0]+m*v[0]+o*w[0] ; 
    krec[1] = l*u[1]+m*v[1]+o*w[1] ; 
    krec[2] = l*u[2]+m*v[2]+o*w[2] ; 
    return k_vector_calculation(&krec[3]); 
} 
+1

你的函數看起來像一個遞歸函數。這是真的嗎? – ysap 2014-11-25 13:04:27

+3

您已被重複告知**,當變量的定義爲'int krec [3]'時,'&krec [3]'無效。 – 2014-11-25 13:04:31

+1

此外,如果無效數組訪問沒有你的程序崩潰,你將最終堆棧溢出,因爲您的(可能是無意的)遞歸沒有基本情況/終止條件。 – 2014-11-25 13:06:53

回答

1

的問題是在這裏

return k_vector_calculation(&krec[3]); 

您傳遞了int陣列krek[3]在有效位置是krek[0]krek[1]krek[2]。還有,你有一個無限遞歸作爲您在最後的return聲明中一次又一次地調用該函數。

+0

'lx''ly'' lz'在哪裏聲明和初始化? – Gopi 2014-11-25 13:32:37

+0

@Gopi,也許他們是全局變量或something.OP沒有表現出他的大部分code.So我不能肯定地說 – 2014-11-25 13:38:43

+1

是,如果他們不被初始化,然後它們的值將是不確定的,因此也可能會崩潰的代碼。 – Gopi 2014-11-25 13:39:40