2011-03-21 2 views
3

가능한 중복 :
Can a pointer (address) ever be negative?은 -1 유효한 포인터 주소를

내가 (memset 함수 모든 -1s에 구조를 초기화하는 고려 중이 야가 없이 서명 번호를 사용하기 때문에하고 0은 유효한 값입니다).

유효한 포인터 주소는 -1입니까? 내 아이디어에 다른 문제가 있습니까? 참고 : 플랫폼은 linux/gcc/x86입니다.

P.S. 모든 포인터가 아닌 구조체를 초기화하려고하는데, 0 값이 유효하지 않은 모든 값에 유효하기 때문에 선택적으로 한 함수에서 부분 초기화를 수행하고 초기화되지 않은 필드를 나중에 기본값으로 초기화 할 수 있습니다. c에서 이것을 수행 할 패턴/전략이 있다면?

+1

@Naveen : OP가'memset'을 사용하는 복제본이 아닙니다. –

답변

3

포인터로 -1의 해석은 아키텍처에 따라 다르므로 신뢰할 수 없습니다.

일반적으로 memset은 포인터가 아닌 바이트를 설정합니다. C는 개별 바이트가 결합되어 포인터를 만드는 방법에 대해 어떠한 보증도하지 않습니다. 솔루션이 작동하는 경우에도 작동 원리와 이유를 문서화해야합니다.

NULL이 유효한 값인 경우 더 좋은 생각은 모든 포인터를 적절한 유형의 센티널에 설정하는 것입니다. 따라서 구조에 필드가있는 경우 int *ip :

static const int sentineli; 

// in the initialization: 
foo->ip = (int *)&sentineli; 

그런 다음이 값과 비교하십시오. 이것은 자기 기록이다.

+0

이들 필드는 모든 포인터가 아닙니다. –

+1

@Roman :'memset'으로 포인터를 초기화하는 것은 여전히 ​​아주 좋은 생각입니다. –

1

일반적으로 음수는 구현 정의 방식으로 저장됩니다. 일부 구현에서는 1의 보수를 사용하여 음수를 저장하고 다른 구현에서는 2의 보수를 사용합니다.

내 생각에는 다른 문제가 있습니까?

구현에 따라 코드를 이식 할 수없는 경우가 있습니다.

+0

-1은'memset'과 함께 항상 -1 비트 패턴이 될 것입니다. -1이'unsigned char'으로 변환되기 때문입니다. 물론 그것은 반드시 정수 값 -1과 일치 할 필요는 없으며 C에 -1의 포인터 값과 같은 것이 없다. –

3

일반적으로 유효한 포인터 값은 NULL이며 기존 개체의 시작, 내부 및 바로 뒤의 포인터입니다. 또한 NULL은 반드시 0을 갖는 비트 패턴으로 표현 될 필요는 없습니다.

일부 아키텍처에서는 -1이 유효한 포인터 값입니다. 일부 마이크로 컨트롤러는 메모리의 낮은 부분에 RAM이 있고 상단 부분에 플래시와 같은 읽기 전용 메모리가 있습니다.

0

실제 데스크탑 또는 서버 시스템에서 포인터로 -1 변환은 전체 비트 1 포인터 표현과 동일하며 유효한 포인터가 아닙니다. 포인터 추가가 정수 추가로 수행된다고 가정하면 포인터가 all-bits-one 표현을 가지고 있다면 p+1은 모든 비트 0 포인터가 될 것입니다. 실제 포인터는 0 포인터입니다.

그럼에도 불구하고, 이것의 어느 것도이 표준에 의해 보장되지 않습니다.

관련 문제