2017-04-11 4 views
0

이 코드 감안할 때 :C++은 각 변수가 저장된 위치를 수정합니까?

void myFunction (int * a) { 
    *a = 10; 
} 

int main() { 
    int *b = new int; 
    *b = 20; 
    myFunction(b); 
} 

오전 내가 바로 생각을하는 두 및 리터럴 값 10가 리터럴 값 (10)의 메모리 주소를 잡고합니다 (스택에 저장됩니다)?

또한, 값 20 힙에 저장되는 동안 B는 스택에 저장되어있는 것은 말할 맞습니까?

감사합니다!

+2

리터럴 값을 스택에 저장되지 언급하지 않는

xor rax,rax 

로 컴파일 될 수있다. – Havenard

답변

0

아닙니다. myFunction()은 힙 할당 된 포인터 int에 대한 포인터를받습니다. 따라서 a이 스택에 저장되는 동안 숫자 10은 힙에 저장됩니다.

ab이 모두 동일한 포인터이기 때문에 동일한 포인터가 분명히 한 번에 한 위치를 가리킬 것입니다.

일부 호출자는 myFunction()을 호출하고 로컬 범위에서 선언 된 변수 인 int에 대한 포인터를 전달하여 해당 스택에 저장됩니다. 이 경우 myFunction()의 매개 변수와 그 매개 변수가 궁극적으로 스택에 상주합니다. 그러나이 경우 포인터는 동적 범위에서 인스턴스화 된 int을 가리키며 힙에 저장됩니다.

0

기술적으로 말하자면 C++에는 "스택"이라는 개념이 없습니다. 대신 적절한 용어는 "저장 기간"입니다.

자동 저장 기간이 인 객체는 실제 스택 스택과 관련이 없지만 "스택에 저장"되는 것으로 종종 언급됩니다. 당신의 객체의 수명이 범위에 바인딩되는

대신에 자동 저장 기간을 보장 그들이에 정의 된 사용자의 경우

당신이 자동 저장 기간이 두 개체가 있습니다. main()의 범위에 정의 된 int *b을, 그리고 int* amyFunction입니다. 둘 다 int에 대한 포인터입니다.

사용자가 가지고있는 세 번째 개체는 new int 문으로 생성 된 int입니다. 그것은 동적 저장 기간이이고, 즉 힙에 저장됩니다. ab은 모두 값을 수정하는 데 사용됩니다.

마지막으로 리터럴은 전혀 저장되지 않습니다. 리터럴은 고정 값이므로 이진 코드에 하드 코딩됩니다. 다시 이것은 실제 값이 바이너리에 "저장"된다는 것을 의미하는 것이 아니라 컴파일러가 그 값을 사용하는 효과를 설명하는 것입니다.

a = 0; 

명시 적 변수가 초기화 될 때이 복사되고 0