programing

포인터 p의 경우 극단적인 경우 p < p+1이 false일 수 있습니까?

copysource 2022. 7. 21. 22:21
반응형

포인터 p의 경우 극단적인 경우 p < p+1이 false일 수 있습니까?

포인터 변수 p에 대해 p<(p+1)가 false일 가능성이 있습니까?답을 설명해 주세요.만약 그렇다면 어떤 상황에서 이런 일이 일어날 수 있을까요?

p+1이 넘쳐서 0이 될 수 있는지 궁금합니다.

예: C 언어 프로그램용 GCC-4.8이 탑재된 64비트 PC의 경우:

int main(void) {
   void *p=(void *)0xFFFFFFFFFFFFFFFF;

   printf("p      :%p\n", p);
   printf("p+1    :%p\n", p+1);
   printf("Result :%d\n", p<p+1);
}

반환:

p      : 0xffffffffffffffff
p+1    : (nil)
Result : 0

그래서 저는 이 경우에 가능하다고 생각합니다.잘못된 포인터 위치에 대해 발생할 수 있습니다.내가 생각할 수 있는 유일한 해결책은 이것뿐이다.다른 이들이 있나요?

주의: 전제조건은 없습니다.이 문제가 발생할 가능성이 있는 컴파일러/플랫폼/아키텍처/OS를 검토합니다.

포인터 변수의 경우 가능합니까?p,그거p<(p+1)거짓인가요?

한다면p는 올바른 유형의 유효한 오브젝트(즉, C++ 오브젝트모델에 따라 작성된 오브젝트)를 가리키고 다음으로 no를 가리킵니다. p+1이 오브젝트 뒤에 있는 메모리 위치를 가리키며 항상 다음 값을 비교합니다.p.

그렇지 않으면 산술과 비교의 동작이 정의되지 않으므로 결과는 참, 거짓 또는 노란색이 될 수 있습니다.

만약 그렇다면 어떤 상황에서 이런 일이 일어날 수 있을까요?

이 문제는 에 의해 발생할 수도 있고 아닐 수도 있습니다.

p = reinterpret_cast<char*>(numeric_limits<uintptr_t>::max);

포인터 산술이 부호 없는 정수 산술처럼 작동하면 다음과 같은 숫자 오버플로가 발생할 수 있습니다.p+1값이 0이고 비교 대상이 되는 값은p아니면 뭔가 다른 걸 할 수도 있어요

DOS 상에서 프로그래밍을 하고 있는데, 원점(세그먼트와 오프셋으로 이루어진 것)이 있고, 세그먼트내의 마지막 주소를 가리키고 있는 경우, 거기에 1개를 추가하면 포인터가 감겨 버립니다.비교할 때 포인터를 정규화하는 것처럼 보이므로 두 번째 포인터는p+1보다 적을 것이다p.

이것은 암울한 시도입니다만, 저는 테스트할 수 있는 DOS C 컴파일러를 가지고 있지 않습니다.

매우 심플:정의되지 않은 동작이 관련되지 않은 경우 발생할 수 없습니다.그것은 정의되지 않은 행동이 있을 때 매우 쉽게 일어날 수 있다.자세한 내용은 C Standard 또는 C++ Standard 사본을 참조하십시오.

그 결과 컴파일러에 적합한 컴파일러는 < 연산자를 전혀 평가하지 않고 1 또는 true를 대신 사용할 수 있습니다.부호 있는 정수를 사용한 산술에서도 마찬가지입니다(단, 부호 없는 정수는 제외됩니다.이 경우 완전히 합법적인 코드는 x > x+1일 수 있습니다).

당신의 예 코드는 C나 C++도 아니기 때문에 컴파일러를 표준 준거 C나 C++ 컴파일러가 아닌 모드로 사용하고 있는 것 같습니다.

잘못된 포인터로 인해 발생할 수 있습니다.

그러나 포인터가 유효한 메모리 위치를 가리키고 있는 경우, 많은 운영체제(Linux 등)에서는 실제로 발생하지 않습니다(적어도sizeof(*p)는 그다지 크지 않습니다.실제로 주소 공간의 첫 페이지와 마지막 페이지는 매핑되지 않기 때문입니다(단, 강제로 매핑할 수 있습니다).mmap&MAP_FIXED를 참조해 주세요.

(커널 내부 또는 일부 마이크로컨트롤러에서) 구현의 경우, 상황은 다르고 구현에 따라 다릅니다(정의되지 않은 동작 또는 지정되지 않은 동작일 수 있습니다).

C의 포인터 비교에 따르면 서명이 되어있나요, 아니면 서명이 되어있지 않나요?스택 오버플로우:

C/C++에서는 임의의 포인터를 법적으로 비교할 수 없습니다.이러한 비교의 결과는 정의되어 있지 않다.

언급URL : https://stackoverflow.com/questions/27272992/for-a-pointer-p-could-p-p1-be-false-in-an-extreme-case

반응형