2011-02-01 2 views
2
int &sum(int numa, int numb) 
{ 
    int sum = 0; 
    sum = suma+sumb; 
    return sum; 
} 

이 기능이 맞습니까? &을 사용하는 이유는 무엇입니까?함수 서명에 이름 앞에 "&"표시가 있으면 무엇을 의미합니까?

추가 된 댓글 : 감사합니다. 그러나 gcc를 사용하여 컴파일 한 후에는 경고 하나가 나오지만 오류는 발생하지 않았습니다. 그것은 완벽하게 실행할 수 있습니다. 아직도 틀렸어? 아니면 그냥 경고 문제? -

+0

이것은 분명히 crummudgeonly old C 해킹에 의해 작성되었습니다. :) –

+0

*이 함수는 올바른지, 아니요,하지만 서명 ('int &'return type) 때문에 아닙니다. UB 인 임시 변수에 대한 참조를 반환하기 때문에 올바르지 않습니다. –

+0

나에게이 기능은 정확하다. 그러나 버그가 없습니까? 절대적으로하지! – Marlon

답변

13

&은 참조를 반환한다는 것을 의미합니다. 귀하의 경우에는 int에 대한 참조가 반환되며 함수가 반환 되 자마자 사라집니다. 이것은 심각한 버그입니다.

3

아니요 로컬 변수에 대한 참조를 반환 할 수 없습니다.

+10

당신은 할 수 있지만 당신은하고 싶지 않습니다. – nc3b

+5

, 정적 인 경우는 예외입니다. – kenny

+1

@ nc3b 이렇게하면 컴퓨터가 불타 버립니다. – Marlon

4

이 함수는 정수에 대한 참조를 반환하려고합니다. 정수는 함수에 대해 로컬이므로이 정의는 유효하지 않습니다. 함수가 반환되면 정수는 범위를 벗어납니다.

0

&은 변수에 대한 참조가 반환됨을 나타냅니다. 원본이 더 큰 오브젝트 인 경우 도움이 될 수 있습니다. 그 이유는 어떤 경우에는 사본을 만들어야하기 때문에 저장됩니다.

그러나 int에 대해서는이 작업을 수행 할 이유가 없습니다. 실제로 함수가 반환 될 때 원본이 할당 해제되므로 여기에서 사용한 것처럼 문제가 발생합니다.

2

찾아보기 C++ References. 참조 (또는 포인터)를 지역 변수에 반환하는 것은 안전하지 않습니다. 함수가 종료되고 반환 된 포인터가 undefined 메모리를 가리키면 로컬 변수가 소멸됩니다.

3

sumasumb이 전역 범위에서 선언되지 않는 한 악의적 인 육체적 인 지역 변수에 대한 참조를 반환하는 것 외에도이 함수는 존재하지 않는 이름을 사용하고 있습니다.

1

위의 답변 대부분이 반환 된 참조 아이디어를 정리했기 때문에 "할당 해제"되는 아이디어와 관련하여 좀 더 정확할 것이라고 생각했습니다.

함수 호출은 인수와 자동 (로컬로 선언 된) 변수를 메모리의 스택에 배치합니다. 함수가 반환되면 해당 메모리는 0으로 초기화되지 않습니다. 값은 그대로두고 스택이 커짐에 따라 그 메모리는 나중에 함수에 다시 사용됩니다.

이렇게 반환 된 참조를 사용하면 조금만 유효 할 수 있지만 다른 함수의 임의 데이터는 동일한 자리에 쓸 것이며 가비지 데이터를 표시합니다.

관련 문제