2010-12-08 4 views
2

에서 변수의 메모리 주소에 대한 관측은 ... 나는이 간단한 프로그램을 작성했습니다 (마녀는 아마도 메모리 문제를 발생)오히려 문제보다 질문이 C

결과를받은 후, 상기 메모리 (c, x, yz)에서의 각 변수의 위치를 ​​표시하면 다음 다중 기능들을 곱하고,이 프로그램에 입력을) C 2 개 INT 변수를 개발한다.

나는 (내 경우) 사람들은 결과이다이 간단한 예제를 테스트 한 : 당신이 볼 수있는

The Memory adresse of c is : 2293556 
The Result of the multiplication is : 12 
The Memory adresse of x is : 2293620 
The Memory adresse of y is : 2293616 
The Memory adresse of z is : 2293612 

, 메인 함수에서 선언 된 세 개의 변수 x, y, z 폐쇄했다 메모리 주소 (22936xx), 다중 함수에서 선언 된 변수 c는 다른 주소 (22935xx)를가집니다. (: &x-&y=4, &y-&z=4 즉)에 x, yz 변수를보고

, 우리는 각각 두 변수 사이에 4 바이트의 차이가 있음을 볼 수 있습니다.

제 질문은 왜 두 변수의 차이가 4입니까?

+2

'(int)'로 먼저 캐스팅하지 않는 한 포인터 값을 출력하는 데'% d '을 사용하는 것은 잘못된 것입니다. 대신'% p'를 사용하십시오. –

+0

감사합니다. 포인터를 사용하려고했는데 캐스트 오류가 발생했습니다. – SmootQ

답변

5

x, yzcall stack (아래 참조)에 생성 될 정수 변수입니다. sizeof int은 4 바이트이므로 컴파일러가 해당 변수에 대해 스택에 할당 할 공간의 크기입니다. 이 변수들은 서로 인접 해 있으므로 4 바이트 씩 떨어져 있습니다.

calling conventions에 대한 정보를 찾아 로컬 변수에 대한 메모리 할당 방법을 읽을 수 있습니다.

일부 경우 (주소 연산자를 사용하지 않는 경우) 컴파일러는 로컬 변수를 레지스터에 최적화 할 수 있습니다.

+0

설명에 대한 감사와이 설명에 대한 링크 – SmootQ

2

기계의 기계어 크기는 4 바이트이므로 프로그램에 의한 액세스 속도를 위해 각 변수는 4 바이트 경계에서 오프셋됩니다.

+0

정렬은 중요하지만 여기서 문제가되지는 않습니다. –

+0

3 개의 char 변수가 선언 되었다면 같은 경계에있을 것입니다. – KevinDTimm

+0

그러나 다른 변수의 c 변수가 x와 z 위치에서 조금 떨어져있는 같은 경계에 있지 않다는 놀라운 점이 있습니다. – SmootQ

4

상황에 따라 3 개의 변수가 인접한 메모리 블록에 할당되었습니다. x86 시스템에서 int 유형은 32 비트 폭 (예 : sizeof(int) == 4)입니다. 따라서 각 변수는 마지막 변수와 4 바이트 떨어져 있습니다.

+0

이 sizeof (int) == 4 주셔서 감사합니다. – SmootQ

2

로컬 변수는 "스택"에 할당됩니다. 컴파일러는 종종 순차적 인 순서로 넣을 것입니다. 이유가 없기 때문입니다. C의 정수는 4 바이트입니다. 따라서 yx 다음에 4 바이트가되고, zy 다음에 4 바이트가됩니다.

+0

하지만 내 컴퓨터의 경우 또는 전 세계의 모든 컴퓨터에 대해서만 해당됩니까? 64 비트 컴퓨터의 경우 정수는 8 바이트 떨어져 있다고 결론을 내릴 수 있습니다. – SmootQ

+0

대부분의 int 타입은 64 비트 머신에서도 32 비트입니다. (기계의 "비트"는 정수의 크기가 아니라 메모리 주소 레지스터의 크기를 의미합니다.) 64 비트 정수를 얻으려면 'long'유형을 사용하십시오. – chrisaycock

+0

http://en.wikipedia.org/wiki/64-bit#64-bit_data_models –

2

32 비트 시스템에서 실행중인 것처럼 보입니다. int의 크기는 32 비트이고, 바이트는 8 비트이고 int의 크기는 4 바이트입니다. 각 메모리 주소는 1 바이트에 해당하므로 각 로컬 변수의 주소 사이에 4 차이가 있습니다.

+0

에 감사드립니다. 정말 유용했습니다. – SmootQ

+0

64 비트 머신은 여전히'int' 타입을 위해 32 비트를 할당 할 수 있습니다. – chrisaycock