2014-11-04 3 views
0

함수에서 구조체 포인터를 반환해야했지만 포인터로 저장하지 않았으므로 반환하려면 return &myStructObject;을 사용했습니다. 그것은 컴파일 시간 오류를주지 않지만 내가 뭘 하려는지 올바른지?Return with Ampersand

+1

로컬 변수의 주소를 반환하면 안됩니다. – Jarod42

+0

그것은'myStructObject'의 수명에 달려 있습니다. 지역 변수 인 경우 함수에서 돌아와 정의되지 않은 동작을하면 파기됩니다. –

+0

해당 구조체 개체가 메서드의 로컬 개체입니까? – CinCout

답변

0

참조하는 구조체 객체가 함수에 대해 로컬 인 경우 해당 구조체 객체의 주소를 반환하면 안됩니다. 함수가 호출자에게 호출을 반환하면 모든 로컬 변수가 메모리에서 삭제되기 때문입니다. 예컨대 들어

: - 아래

당신이 함수의 지역 무언가를 가지고 당신이 그에게 주소를 반환하는 경우
int* myFunc() 
{ 
    int p = 4;   // memory is allocated for p. 
    // do something. 
    return &p;   // memory for p is deallocated and you are returning pointer to that memory 
} 
+2

"해당 구조체 개체의 주소를 반환 할 수 없습니다." 그건 사실이 아니야. 당신은 그렇게 할 수 있습니다. 좋은 생각은 아니지만 프로그램이 컴파일됩니다. – Daniel

+0

내가 링크 된 복제물을보고 싶을 수도 있습니다. – Deduplicator

+1

치명적인 오류가 발생했다면 정말 좋을 것입니다. – Deduplicator

-1

가 분실 될 것이다 치명적인 오류 즉 무효입니다. 그 이유는 주소를 반환하는 함수가 스택에서 POPP되고 비 정적 (비 전역) 항목이 손실되기 때문입니다. 본질적으로, 프로그램 메모리가 "평생"자원으로 얻지 못한 것은 사라질 것입니다. 함수에 포인터를 인수로 전달할 수 있으며 포인터를 가리키는 값을 수정하기 위해 역 참조 할 수 있습니다. 그러나 비 정적 (또는 non-global)이고 주소로 리턴 된 것은 위반 유형 오류에 액세스하게합니다.

+0

@Deduplicator 증거를 보여줄 수 있습니까? – ha9u63ar

+1

당신은 내가 대답에서 언급 한 것을 설명하지 않았습니다. 메모리를 간단히 할당하고 해제 한 다음 메모리에 액세스하려고했습니다. 내 대답에서 내가 뭐라 말 했니? 범위를 벗어나서 스택을 떠나는 것입니다. – ha9u63ar

0

포인터를 반환하려는 구조체 변수가 함수에서 반환 된 후에도 여전히 범위 내에 있으면 수행중인 작업이 올바른 것입니다.

반면에 문제의 struct 변수가 함수에 대해 로컬이고 함수에서 돌아 오면 파기 (해제) 될 경우 반환 할 포인터는 dangling pointer이되며 목적.

편집 : 나는 당신이 그것을 것 생각하지 않을 것이다 의미 "당신의 목적을 제공하지 않을 것이다"으로

! 그것이 해를 끼칠 수있는 일에 대해 논의 할 시점이 없습니다. 당신이 기대하는 바를하지 않을 것이라고 확신 할 때!

+0

실제적으로 예측할 수없고 위험한 방법을 분명히하기 위해 "당신의 목적을 달성하지 못할 것"에 대해 상세히 설명하십시오. 이 링크는 도움이 될 것입니다 : https://stackoverflow.com/q/2397984 – Deduplicator