따라서 this answer에 Michael Burr 님의 의견을 알게 된 C 표준은 배열의 첫 번째 요소를 지나간 포인터에서 정수 빼기를 지원하지 않습니다. 할당 된 메모리가 포함되어 있다고 가정합니다. the combined C99 + TC1 + TC2 (PDF)의 섹션 6.5.6에서어떤 C 컴파일러가 포인터 빼기를 언더 플로우합니까?
:
경우 포인터 피연산자와 같은 배열 객체의 요소에 따라서 포인트 또는 배열 객체의 마지막 요소는 최근 1 둘 다 평가는 과잉을 일으키지 않아야한다. 그렇지 않으면 동작이 정의되지 않습니다.
저는 포인터 연산을 좋아하지만, 전에 걱정했던 적이 없었습니다. 나는 항상 주어진 것으로 가정했습니다
int a[1];
int * b = a - 3;
int * c = b + 3;
c == a
있다.
내가 이전에 그런 종류의 일을하고 물지 않았다고 믿는 동안, 내가 함께해온 다양한 컴파일러의 친절 함 때문일 것임에 틀림 없다. 표준은 내가 생각한대로 포인터 산술 연산을해야합니다.
제 질문은 일반적인 내용입니다. 저에게 친절한 컴파일러가 있습니까? 포인터의 산술 연산이 배열의 경계를 벗어나는 표준입니까?
CPU 아키텍처와 관련하여 컴파일러의 문제는 그리 많지 않습니다. 거기에 몇 가지 모호한 메모리 모델이 있습니다, 당신은 일반적으로 모든 시스템에서 일반 선형 메모리를 가정 수 없습니다. 포인터를 메모리 주소로 생각하지 마십시오. 그들은 아니다. 그들에는 분리 된 세트가있다. – jalf