2013-10-21 2 views
0

내 함수에 정의되지 않은 동작이 있습니까? 로컬 변수 c가 있으므로 자동 위치에 있으므로 함수 실행 후 소멸됩니까? (범위의 끝)내 코드가 정의되지 않은 동작입니까

int* calculate(int* a,int* b) 
{ 
    int c=(*a)+(*b); //local variable c 
    return &c; 
} 
int main() 
{ 
    int a=12; 
    int b=23; 
    int* ptr=calculate(&a,&b); 
    std::cout<<*ptr<<endl; 
} 
+1

예는 UB입니다. 지역 변수의 주소를 반환하고 있습니다. – juanchopanza

+0

ok 고맙습니다;) –

+0

ok 감사합니다. C 변수를 사용하지 않고 return (* a) + (* b); 그것도 정의되지 않은 동작이 될 것입니까? 지역 변수가 없으므로 –

답변

2

예, 임시 로컬 객체에 대한 포인터를 반환하고 역 참조하는 정의되지 않은 동작입니다.

calculate 함수를 종료하면 해당 객체가 범위를 벗어나서 자동으로 삭제되고 제공된 포인터가 유효하지 않은 주소를 가리키며 매달린 포인터가됩니다. 그런 다음 참조 해제를 사용하여이를 사용할 수 있습니다 (예 : *ptr). 귀하의 경우에는

, 당신은 제거, 일반 변수를 사용할 수있는 그 * :

int calculate(int *a, int *b) 
{ 
    int c = (*a)+(*b); 
    return c; 
} 

당신이 포인터를 전달하는 합리적인 아무것도 없기 때문에, 그것을 제거하는 것이 좋습니다 더 * :

int calculate(int a, int b) 
{ 
    int c = a + b; 
    return c; 
} 
+0

ok 감사합니다. C 변수를 사용하지 않고 그냥 return (* a) + (* b); 그것도 정의되지 않은 동작이 될 것입니까? 지역 변수가 없으므로 –

+0

@DonCarleone :'(* a) + (* b)'는 포인터가 아니기 때문에 반환 할 수 없으므로 컴파일 오류가 발생합니다. 내 대답을 업데이트했습니다. 다시 살펴보십시오. – deepmax

+0

** 잘못된 주소를 가리키며 매달려있는 포인터입니다 ** 잘못되었습니다! 매달려있는 포인터가 없습니다! 모두는 매달려있는 포인터를 말합니다. 그러나 여기에 매달린 것과 같은 것은 아닙니다. 이 C는 파괴 될 것이므로 그것이 존재하지 않는다는 것을 의미합니다. 주소가있는 메모리 장소에 더 이상 메모리가 없을 것입니다. 그래서 우리는 일반적으로 NULL이라고 말하는이 알려지지 않은 장소 주소를 어떻게 호출 할 수 있습니다. 따라서 Main ptr 포인터 값은 NOADDRESS가되고 NULL이됩니다. –

1

main에 신고 된 intcalculate으로 전달할 수 있습니다. 예 :

void calculate(int* a,int* b, int* c) 
{ 
    *c=(*a)+(*b); 
    return ; 
} 
int main() 
{ 
    int a=12; 
    int b=23; 
    int c=0; 
    calculate(&a,&b,&c); 
    std::cout<<c<<endl; 
    return 0; 
} 

훨씬 더 간단한 방법이다 ::

int Calculate(int a, int b) 
{ 
    return a+b ; 
} 
int main(void) 
{ 
    int a=12, b=23; 
    std::cout<<Calculate(a,b)<<endl; 
    return 0; 
} 
관련 문제