2013-03-09 92 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坏,这并不意味着更多的使用。