2013-03-09 6 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

Если вы не можете найти свою ошибку, тогда выполните debug – nabroyan

+0

, вы возвращаете указатель на локальный массив в or1 и and1 – AnatolyS

+0

Почему бы вам не передать результирующий массив в качестве третьего параметра и сохранить результат в нем и вернуть void? Это изменение прототипа void and1 (int * A, int * B, int * ret) и то же для or1. Это гарантирует, что сделанные вами изменения будут сохранены в результате. – IcyFlame

ответ

3

Вы возвращаетесь указатели на массивы, которые являются локальными для функции и эти локальные массивы не существует, когда область видимости функции { } заканчивается. То, что вы получаете, является указателем, указывающим на то, что не существует, и Неопределенное поведение.

+0

Это все объясняет. Спасибо. Я выберу это как ответ (Aftere 10 минут или около того, когда система позволит мне) Еще раз спасибо. – Bloodcount

2

int ret[3]; в функции and1 - это переменная локальная к and1. Когда and1 завершает выполнение, он выходит за рамки. Поэтому возврат его адреса не имеет смысла. Вместо этого, вы могли бы передать ret массив and1 (аналогично для OR1), с прототипом бытия:

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 истребляют, и это не означает, что больше использовать.

Смежные вопросы