2013-02-16 3 views
7

알고 있습니다 : char *는 char에 대한 포인터입니다. 및 int *는 int에 대한 포인터입니다.char *의 크기는 int *의 크기와 동일합니까?

그래서, 나는 다음과 같은 두 가지 작업을 수행 확인하려면 :

  1. 그래서 지금은 32 비트 컴퓨터에서 나는 가정, 다음의 메모리 주소는 32 비트 넓은 의미한다. 따라서 char *와 int *의 크기는 모두 32 비트 (4 바이트)입니다. 맞습니까? 또한 char * *의 크기도 int *의 크기와 동일합니까?

  2. 내가 가지고있는 것으로 가정하면 : int * ptr; * ((INT *) PTR)는 동일한 = 0x514로

따라서 지금 * ((* CHAR) PTR) = 0x154 하 바로 동일? (0x514는 임의의 임의의 메모리 주소입니다.)

플랫폼 : 저는 x86입니다.

추신 : 나는 형식 캐스트가 코드 작성을위한 제안 된 방법이 아니라는 것을 알고 있습니다. 하지만 커널 코딩을하고 있습니다. 따라서 타입 캐스팅을해야합니다!

+0

표준이 그것을 말하지 않더라도 실제로 다른 환경을 쉽게 찾을 수 있을지는 의문입니다. – Mysticial

+0

크기는 실제로 동일하지만 정렬 요구 사항은 다릅니다. – DCoder

+0

"커널 코딩"을하고 있다면, 이는 이미 코드가 실행될 수있는 플랫폼의 수를 제한합니다. 지원되는 OS 스펙을 확인하십시오. –

답변

11

C 포인터는 not guaranteed to have the same size입니다. 실제로 대부분의 구현 포인터는 동일한 크기이지만 컴파일러의 구현 세부 사항입니다. C Faq에서

:

오래된 HP 3000 시리즈는 바이트 워드 주소보다 주소를 다른 주소 체계를 사용한다; 위의 기계의 여러처럼 그러므로, 8086 계열 프로세서 (PC 호환) 수도의 char *에 대해 서로 다른 표현과 사용의``메모리 모델 '에 따라 다른 포인터

보다 무효 * 포인터를 사용 16 비트 데이터 포인터와 32 비트 함수 포인터를 사용하거나 그 반대의 경우도 마찬가지입니다.

*((char *)ptr) = 0x154*((int *)ptr) = 0x154과 같지 않습니다.포인터를 역 참조하기 때문에 char 크기의 데이터와 int 크기의 데이터를 ptr이 가리키는 위치에 씁니다. 8 비트 char 및 32 비트 int를 가정하면 ptr*((int *)ptr) = 0x154에 할당 된 메모리 주소에 0x154을 쓰고 ptr에 할당 된 주소에서 시작하여 4 바이트에 0x0000000154을 쓸 것입니다.

+0

짧은 대답이지만 훌륭한 링크. 예를 들어, "단어가 더 오래된 프라임 컴퓨터는 워드 포인터 (int *)보다 큰 바이트 포인터 (char *)를 필요로하는 것으로 악명이 높습니다." –

+0

@ shf301 : * ((char **) ptr) = 0x154로 편집했습니다. – user1599964

+0

@ user1599964 당신의 예에서 다른 값을 갖는 것으로 오타가 있다고 가정했는데 - 'char **'또는 'int *'에 대한 캐스팅은 매우 다른 것을 의미하며 직접 비교할 수는 없습니다. 그들은 서로 다른 수준의 간접적 인 행동을하고 있으며 심지어는 동일한 일을하는 일이 거의 없습니다. – shf301

1

기술적으로 말하자면 C 표준은 sizeof (char) == 1만을 보장하며 나머지는 구현에 달려 있습니다. 그러나 현대의 x86 아키텍처 (예 : Intel/AMD 칩)에서는 상당히 예측 가능합니다.

아마도 프로세서가 16 비트, 32 비트, 64 비트 등으로되어 있다고 들었을 것입니다. 이는 일반적으로 프로세서가 N 비트를 정수로 사용한다는 것을 의미합니다. 포인터는 메모리 주소를 저장하고 메모리 주소는 정수이기 때문에 포인터에 얼마나 많은 비트가 사용되는지 효과적으로 알 수 있습니다. sizeof는 일반적으로 바이트 단위로 측정되므로 32 비트 프로세서 용으로 컴파일 된 코드는 포인터 크기를 4 (32 비트/바이트/바이트)로보고하고 64 비트 프로세서 용 코드는 포인터 크기를 8 (64 비트/바이트 당 8 비트). 32 비트 프로세서 용 4GB RAM의 한계는 다음과 같습니다. 각 메모리 주소가 1 바이트에 해당하는 경우 더 많은 메모리를 처리하려면 32 비트보다 큰 정수가 필요합니다.

실제로 포인터는 16 비트 시스템에서 찾을 수 있다면 크기 2이고 32 비트 시스템에서는 4 개가 있고 64 비트 시스템에서는 8 개이지만 얻을 수있는 것은 없습니다. 주어진 크기에 의존

+0

[표준위원회도 고려한] 36 비트 또는 48 비트 아키텍처를 실행하기까지는 괜찮습니다. (http://stackoverflow.com/questions/6971886/exotic-architectures-the-standard-committee-cares-about). –