c프로그래밍중 이상한 점을 발견하였습니다..
#include <stdio.h> int main(void) { int arr[2][3]; char brr[2][3]; printf("Size of A:%d \n" , sizeof(*(arr+1)) ); // == sizeof(arr[1]) printf("Size of A:%d \n" , sizeof(arr[1]) ); printf("Size of A:%d \n" , sizeof(arr+1) ); printf("Size of arr:%d \n \n" , sizeof(arr) ); printf("Size of B:%d \n" , sizeof(*(brr+1)) ); // == sizeof(brr[1]) printf("Size of B:%d \n" , sizeof(brr[1]) ); printf("Size of B:%d \n" , sizeof(brr+1) ); //이곳을 '4'로 출력하는 이유? printf("Size of brr:%d \n" , sizeof(brr) ); return 0; }
2차원 배열을 공부하면서 생긴 의문점 인대요.
제가 arr은 int 형으로, brr은 char 형 으로 구현 하였습니다. arr+1 과 arr[1] 의 차이점을 눈으로 보기 위해 작성한 코드 인대 저는 arr+1과 arr[1]의 차이점을 이러한 방식으로 이해하였습니다.
{메모리 구조를 나타낸 것 입니다.}
//arr[2][3]
ㅁ(0,0)
ㅁ(0,1) arr+1은 (1,0)의 메모리를 가리키는 것 이고, arr[1]은 (1,0) , (1,1) , (1,2) => [즉, 1번 행의 모든 메모리를 나타낸다.]
ㅁ(0,2)
ㅁ(1,0)
ㅁ(1,1)
ㅁ(1,2)
//brr[2][3]
ㅁ(0,0)
ㅁ(0,1) brr+1은 (1,0)의 메모리를 가리키는 것 이고, brr[1]은 (1,0) , (1,1) , (1,2) => [즉, 1번 행의 모든 메모리를 나타낸다.]
ㅁ(0,2)
ㅁ(1,0)
ㅁ(1,1)
ㅁ(1,2)
'brr은 자료형이char형인 배열 이므로 brr+1이 나타내는 메모리의 크기는 분명 1byte일것이고 출력결과 또한 '1' 이 나올것이다.' 라고 저는 생각했습니다.
하지만 정상적으로 코드가 컴파일 되고 프로그램이 실행되었을때는 출력결과가 '1'이 아닌 '4'가 출력 되어 진것 이었습니다. 이상하다 싶어서 brr배열의 자료형을 double형으로 바꾸고 컴파일 하여도 같은 결과가 출력되었습니다.(arr배열 또한 마찬가지로 자료형을 바꿔도 똑같이 '4'가 출력되었습니다.)
몇일동안 이 문제를 가지고 고민했는대 이렇다할 실마리나 답을 찾지 못하였습니다...
제가 잘못 이해하고 있는 것인가요? 아니면 제가 모르고 있던 또다른 무언가가 있었던 것일까요?
지식인 여러분들의 답변을 기다리고 있겠습니다.
4로 출력되는건 포인터라고 판단했기 때문입니다.
32비트에서 포인터는 4바이트형을 가지게 됩니다. 저 경우 저부분이 포인터라는 얘기지요.
다만 sizeof가 리턴하는 숫자의 판단은 컴파일러마다 조금씩 달라질 수 있습니다. 현재는 표준이 정해졌을지는 모르겠습니다만..
--
제가 놓친 부분이었군요,,
모든 포인터는 4바이트로 표현된다는 점을 간과하고 있었던것 같습니다.
궁금한 점이 몇가지 더 있는대요. 제가 사용하고 있는 노트북은 64bit시스템을 채용한 노트북입니다.(아마 cpu가 64bit시스템 이겠지요?)
32bit시스템에서 표현할수 있는 모든 정보(?)의 갯수는 2^32승 즉=> 4,294,967,296 이라서 32bit시스템에서 4gb이상의 렘이 필요없는걸로 알고 있습니다.
하지만 64bit시스템에서는 2^64승 => 18,446,744,073,709,551,616 이라는 천문학 적인 숫자가 나오는대 10^19 승의 메로리를 표현할 렘을 탑제하지 않고 일반적으로 쓰이는2~8gb사이의 렘을 탑제하는것에 의문점을 가지고 있습니다. 64bit시스템에서도 32bit시스템 처럼 처리해서 그런것 이라는것은 알고있는대 64bit시스템 과 32bit시스템의 차이점에 대해서도 아직 잘 모르겠습니다..
질문자체가 조금 모호해 지긴 했는대요,, 큰 요지는 '64BIT도 32BIT처럼 사용하는대 64BIT를 사용하느냐' 입니다... 아,, 쓰면 쓸수록 내용이 산으로 가는것 같내요;
혹시 이부분에 대해서도 알려주실수 있으신가요?
x64로 컴파일하면 똑같은 구문이 8로 나옵니다.
64비트 시스템인데도 2~8GB만 달고 나오는것은 램이 비싼것도 있고 아직 저걸 초과할만큼 많은 양의 메모리를 사용하는 프로그램이 많지 않기 때문입니다. 하지만 시간이 지나면 16GB, 32GB를 장착한 시스템도 흔해지겠죠. 지금껏 그래왔듯이 말입니다.
헷갈리실만한 부분이 있다면, 64비트 OS라고 모든 프로그램이 다 64비트인것은 아니라는 겁니다. 32비트 프로그램을 호환할 수 있는 경우가 대부분이고 이경우에는 물론 해당 프로그램 입장에선 32비트 어드레싱의 한계를 그대로 갖게 됩니다.
--
...
> 하지만 64bit시스템에서는 2^64승 => 18,446,744,073,709,551,616 이라는 천문학 적인 숫자가 나오는대 10^19 승의 메모리를 표현할 렘을 탑재하지 않고 일반적으로 쓰이는2~8gb사이의 렘을 탑재하는것에...
인터넷으로 찾아보니 4GB 램 모듈이 대략 4만원 근처인 것 같군요.
4GB는 4 * 10^9입니다. 10^19 바이트의 램을 탑재하려면 돈이 얼마가 필요할까요? :)
* "탑제"가 아니라 "탑재"입니다.
금전적 영향이 크게 작용했던 것 이군요;;
역시 '돈' 이 문제가 되었내요....
??
제가 알기론 64비트 운영체제의 경우 physical memory는 실제 8바이트로 쓰입니다만
virtual memory자체는 32비트로 사용하는 경우에 저리 나오는것으로 압니다 ;;
댓글 달기