2012-09-01 4 views
4

C 표준에 대한 또 다른 질문입니다. 나는 이것을 테스트했으며 항상 NULL < ptr을 얻었습니다. 여기서 ptrNULL과 다른 포인터입니다. 그러나 표준에 따르면 포인터 산술과 비교는 배열 범위 내에서만 정의됩니다. 특정 비교 NULL < ptr이 합법적인지 확실하지 않습니다.NULL 포인터가 <다른 포인터 (NULL 제외)입니까?

편집 : 나는 K & R을 읽고하고 난 다음 견적을 발견은 :

모든 포인터는 의미 제로와 평등 또는 불평등에 대한 비교 될 수있다. 그러나 동일한 배열의 멤버를 가리 키지 않는 포인터를 사용하여 산술 또는 비교에 대한 동작은 정의되지 않습니다.

이 질문에 이미 주어진 대답에 영향을 주는지 확신 할 수 없습니다. 어쨌든 p > NULL이 항상 보장되는지 또는 true를 반환하지 않는지 나는 여전히 확신 할 수 없다. p은 포인터 !=NULL이다.

답변

6

NULL < ptr은 유효하지 않습니다. 널 포인터는 상대적으로 비교할 수 없습니다. 이렇게하면 정의되지 않은 동작이 발생합니다.

동일한 개체 (배열의 요소 또는 집계의 하위 개체)를 가리키는 포인터 만 관련성있게 비교할 수있는 것은 맞습니다. 널 포인터는 어떤 객체도 가리 키지 않기 때문에, 그것과 관계를 비교할 수는 없습니다.

+0

정의 아니에요? 0 주소를 참조하지 않는 한 NULL

+6

@JoshPetitt : 여기서 중요한 점은 C에서 포인터의 관계형 비교가 매우 작은 일련의 유효한 시나리오로 제한된다는 것입니다. 두 피연산자는 모두 동일한 집계를 가리키는 포인터 여야합니다. 그렇지 않으면'<'의 동작이 정의되지 않습니다. 그래서, 만약 여러분이'int main() {int x, y; & x & & y;를 반환하십시오. }', 동작은 정의되지 않습니다. 널 포인터가 객체를 가리 키지 않기 때문에 피연산자 (또는 두 피연산자!)가 널 포인터 인 관계 비교를 수행하면 정의되지 않은 동작이 발생합니다. –

+2

그러나'(uintptr_t) & x <(uintptr_t) & y'가 정의되어 있고 함수 호출에 대해 0 또는 1이됩니다. –

3

다른 NULL (= true) 또는 not (= false)와의 비교 만 정의됩니다.

NULL은 일반적으로 그렇게 는 일반적으로보다 작으로 비교합니다 0으로 정의 이지만, 실제로는 0의 값을 가지는 포인터의 특별한 경우를 NULL이 아닌