2013-03-09 110 views
0

這是代碼: A [0](在主函數中)應該等於0,而不是1.我找不到我的錯誤。我想這個問題是在and1函數中的某個地方,但我再次似乎無法找到它。無論如何,我很確定第一句話很好地解決了這個問題,但是網站迫使我寫更多的信息。錯誤輸出

#include <iostream> 
#include <string> 
// V and^or 
using namespace std; 
int A[] = {0, 1, 1}; 
int B[] = {1, 0, 1}; 

int* and1(int A[], int B[]) 
{ 
    int ret[3]; 
    for(int i = 0; i < 3; i++) 
    { 
     if(A[i] == 1 && B[i] == 1) 
     { 
      ret[i] = 1; 
     } 
     else 
     { 
      ret[i] = 0; 
     } 
    } 
    return ret; 
} 

int* or1(const int A[], const int B[]) 
{ 
    int ret[] = {0 ,0 ,0}; 
    for(int i = 0; i < 3; i++) 
    { 
     if(A[i] == 1 || B[i] == 1) 
     { 
      ret[i] = 1; 
     } 
     else 
     { 
      ret[i] = 0; 
     } 
    } 
    return ret; 
} 

int main() 
{ 
    int* a = and1(A, B); 
    int* b = or1(A, B); 
    if(*(a+1) == *(b+1)) 
    { 
     cout << a[0] << endl; 
    } 
    return 0; 
} 
+0

如果你不能找到你的錯誤,然後做調試 – nabroyan 2013-03-09 07:46:12

+0

你爲什麼不通過合成陣列作爲第三PARAM和結果存儲在它並返回void返回指向本地陣列中的OR1和AND1 – AnatolyS 2013-03-09 07:46:59

+0

?這就是將原型更改爲void和1(int * A,int * B,int * ret),對於or1也是如此。這將確保您所做的更改存儲在結果中。 – IcyFlame 2013-03-09 07:51:06

回答

3

你是返回指針到本地的功能和這些地方陣列不當功能範圍{ }兩端存在陣列。你得到的是一個指向不存在的東西的指針和一個未定義的行爲

+0

這就解釋了一切。謝謝。我會選擇這個作爲答案(在系統允許我後10分鐘左右)再次感謝。 – Bloodcount 2013-03-09 07:49:08

2

int ret[3]; in函數and1是一個局部於and1的變量。當and1完成執行時,它將超出範圍。所以返回地址是沒有意義的。 相反,你可以通過ret陣列and1(同樣爲OR 1),與原型之中:

void and1(const int A[], const int B[], int ret[]); 
2

您是從功能and1返回臨時數組的指針。結果是不確定的。

int* and1(int A[], int B[]) 
{ 
    int ret[3]; 
    //... 
    return ret; 
} 

int* a = and1(A, B); // <-- Undefined behavior 

return ret後,數組ret壞,這並不意味着更多的使用。