2017-01-10 5 views
0

저는 C++에서 스택과 힙에 대해 배우려고 노력 중이며, 어떻게 작동 하는지를 알기 위해 테스트를 인쇄하기 시작했습니다.포인터와 일반 int에 대해 이상한 값을 얻었습니다.

`#include <iostream> 

using namespace std; 

int main(){ 

int a; 
int b; 
int *c; 
int *c2; 
int *d{new int}; 

cout << &a << " a= " << a << endl; 
cout << &b << " b= " << b << endl; 
cout << &c << " c= " << c << endl; 
cout << &c2 << " c2= " << c2 << endl; 
cout << &d << " d= " << d << endl; 

delete d; 

return 0; 

} 

출력은 :

0x7ffefad88d00 A = 124

0x7ffefad88d04 B = 0

0x7ffefad88d08 C = O

는이 코드를 작성 0x7ffefad88d10 c2 = 0x 400b20

0x7ffefad88d18 D = 0xec9c20

내가 이해할 수없는 3 가지가 있습니다

  1. 값이 124 인 이유

    ?
  2. 왜 c 값이 0이고 동일한 구문을 가진 c2와 같은 포인터가 아닌가?
  3. 왜 C 크기가 4 바이트가 아니라 단지 2 바이트입니까?
+0

'a'와 triy를 초기화하지 않았으므로 값이 출력되지 않습니다. 이것은 정의되지 않은 동작이므로 아무 일도 일어나지 않을 수 있습니다. 'int'의 크기는 컴파일러에 따라 다릅니다. – doctorlove

+0

고마워,하지만 나도 initialised b ... 그는 왜 complier 값을 얻지 않았다? – adi319

+0

0은 완벽하게 허용되는 난수 – doctorlove

답변

1

a, b, c, d*d의 값은 그들을 undefined behavior 독서, 초기화되지 않은 있습니다. 아무거나는 일어날 수있다, 아무도는 그 가변의 가치를 예언 할 수 없다. 자세한 내용은 this question을 참조하십시오.

포인터의 출력에 대해 많은 구현은 0을 선행합니다. this question을 참조하십시오. Visual Studio 2015에서 포인터 값을 인쇄하려고하면 맨 앞에 0이옵니다.

+0

. 나는 부분에 동의하지만 c로? 그것은 포인터가 된 것으로 양화되어 있습니다 .... – adi319

+0

그리고? http://stackoverflow.com/questions/7546620/operator-new-initializes-memory-to-zero – doctorlove

0

왜 값이 124입니까?

a은 초기화되지 않기 때문에 예측할 수없는 가치가 있습니다. 초기화되지 않은 비 정적 로컬 변수를 읽는 것은 UB입니다. 하지만, 초기화되지 않은 전역 변수와 정적 변수는 컴파일 타임에 0으로 초기화되고 읽는 것이 좋습니다.

왜 c 값이 0이고 동일한 구문을 사용하는 c2와 같은 포인터가 아닌가?

c도 초기화되지 않으므로 위의 내용과 마찬가지로 정의되지 않습니다. c2과 같은 포인터이지만 NULL (0)을 가리 킵니다.

왜 c 크기가 4 바이트가 아니라 단지 2 바이트입니까?

c 포인터의 크기는 아키텍처 및/또는 컴파일러에 따라 다릅니다. 이 경우 c은 8 바이트를 차지합니다. 주소 c2에서 c의 주소를 뺍니다.

0x7ffefad88d10 - 0x7ffefad88d08 = 0x000000000008 이들은 십진수가 아닌 16 진수 값입니다.

따라서 c은 실제로 c2과 같은 포인터이며 메모리의 동일한 공간을 차지합니다.