char* p1;
int* p2;
double* p3;
printf("%d\n", sizeof(p1));
printf("%d\n", sizeof(p2));
printf("%d\n", sizeof(p3));
분명 수업에서 들었을 때는 8바이트가 나올거라고 했는데
실제 위와같이 코드를 치고 실행해보니 4바이트 라고 나왔다..
열심히 검색해보니 이유는
내가 사용하는 Visual Studio에서 32비트 용으로 컴파일 하기 때문..
솔루션 플랫폼을 x86이 아니라 x64로 바꿔주면 8바이트라고 제대로 뜬다.
그리고 리눅스 64비트 환경에서도 gcc로 컴파일 하니 8바이트라고 떴다.
주소값도 16진수로 16자리나 된다.
결론은 내가 개발하고 있는 pc의 환경이 아니라 어느 플랫폼을 대상으로 컴파일하냐에 따라 포인터 크기가 달라질 수 있다..
추가로,
32비트 cpu라고 하면
cpu가 한번에 처리 가능한 데이터의 양=레지스터의 크기=워드 크기=데이터 버스 크기=어드레스 버스 크기
가 32비트라는 뜻이다.
32비트로 표현가능한 수는 0x00000000 부터 0xFFFFFFFF 까지 총 2^32 개.
32비트 cpu에선 4gb(2^2+2^30 byte) 이상의 램을 인식할 수 없는 이유도 바로 이것이다.. 레지스터가 이 이상의 주소값을 표현할 방법이 없다.
한편 64비트 cpu가 수용가능한 램은 이론상 16엑사바이트(2^4+2^60)인데 현실적으로 하드웨어의 한계가 있다고 한다.
'프로그래밍 > C' 카테고리의 다른 글
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (2) - 동적 메모리 할당 (0) | 2022.04.22 |
---|---|
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (3) - 동적 메모리 할당 - 구조체 배열 크기 동적 조절 ( 확대 / 축소 ), #ifdef DEBUG 사용 (0) | 2022.04.22 |
구조체의 크기 / 구조체 정렬 - 패딩비트를 #progma pack 사용으로 해결 (0) | 2022.04.20 |
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (1) - 구조체 배열 (0) | 2022.04.12 |
[ C언어 ] 중복없이 난수생성 / 랜덤값 뽑기 / 로또번호 생성 / 선택정렬 (rand, srand, time 함수) (0) | 2022.04.04 |