포인터 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
'programing' 카테고리의 다른 글
Vuex: 서로 다른 모듈 내 공유 네스트 모듈(복제 없음) (0) | 2022.07.21 |
---|---|
불기지를 설치하다.vuex의 사용자가 영구 루프를 발생시킵니다. (0) | 2022.07.21 |
할당에 대한 Python ?(조건부/삼진수) 연산자 (0) | 2022.07.21 |
String 개체 목록을 연결하는 가장 좋은 방법? (0) | 2022.07.21 |
JavaScript this.toDoList.필터는 함수가 아닙니다. (0) | 2022.07.21 |