2014-03-25 5 views
0

할당을 위해 mallocfree에 대한 고유 함수를 작성 중입니다. C sbrk() 래퍼 기능을 활용해야합니다. 내가 이해 한대로 sbrk()은 프로그램의 데이터 공간을 인수로 전달 된 바이트 수만큼 증가시키고 프로그램 중단 위치를 가리 킵니다. 나는 다음과 같은 코드가있는 경우int에 대한 포인터 캐스팅

는 :

#define BLOCK_SIZE 20

int x;

x = (int)sbrk(BLOCK_SIZE + 4);

을 나는 컴파일러 오류 warning: cast from pointer to integer of different size를 얻을. 왜 이것이 어쨌든 sbrk()이 가리키는 주소를 int으로 전송할 수 있습니까?

+3

'void * x;'를 사용하지 않는 이유가 있습니까? 정수형을 정말로 원한다면'intptr_t x = (intptr_t) sbrk ...;'에서' ' –

+0

int는 32 비트이므로 포인터는 64 비트입니다. long int를 사용해보십시오.sizeof (int)와 sizeof (void *)를 체크해라. –

답변

2

포인터에서 다른 크기의 정수로 캐스트하는 컴파일러 오류 경고가 표시됩니다.
은 왜이

포인터 int 다른 길이를 가질 수 있기 때문에, 예를 들어, 64 비트 시스템 sizeof(void *) (포인터 즉, 길이)에 보통 8이지만, sizeof(int) 일반적이 경우 4.이며 int에 대한 포인터를 캐스팅하여 다시 캐스팅하면 원래 포인터 대신 잘못된 포인터가 표시됩니다.

어쨌든 나는 int에 sbrk()가 가리키는 주소를 캐스트 할 수 있습니까? 당신이 정말로 정수에 대한 포인터를 캐스팅해야하는 경우

, 당신은 <stdint.h>에서, intptr_t 또는 uintptr_t에 캐스팅해야합니다. <stdint.h>(P)에서


:

다음 유형은 유효한 포인터가 될 수 무효화 할 수있는 특성을 가진 부호있는 정수 유형을 지정하는 객체 포인터를 유지할 수

  • 정수 유형 이 형식으로 변환 된 다음 void 포인터로 다시 변환되고 결과는 원래 포인터와 동일하게 비교됩니다. intptr_t

    다음 유형은 유효한 void 포인터를이 유형으로 변환 한 다음 void 포인터로 다시 변환 할 수있는 속성을 갖는 부호없는 정수 유형을 지정하며 그 결과는 원래 포인터와 동일하게 비교됩니다. uintptr_t

    XSI 규격 시스템의 경우 intptr_tuintptr_t 유형이 필요합니다. 그렇지 않으면 선택적입니다.

+0

나는 그것을'intptr_t'에 던져 보았고 컴파일했다. 내가 int로 던지려고하는 이유는 힙에 더 이상의 공간이 있는지를 알 수 있기 때문이다. 위의 코드 조각에서 x가 0보다 작 으면 힙에 더 이상 공간이 없습니다. – user3268401