2014-05-20 5 views
2

I는 다음과 같이 정의 된 포인터는 다음과 같습니다는 음의 배열 인덱스는

A ***b; 

무엇을 수행 할 다음과 같이 접근 : 우리는 부정적인 인덱스를 사용하고 있기 때문에

A** c = b[-1] 

액세스 위반이인가 배열로? 또는 *--b과 유사한 법적 조치입니까?


EDIT 제외 배열 인덱싱 C 및 C++ 다른 지원이 있는지 참고. 따라서 this은 속는 것이 아닙니다.

+3

는 참조 http://stackoverflow.com/questions/3473675/negative-array-indexes :

int * c = q; // q as above c[-1] = 0; // undefined behaviour! 

마지막으로, 단지 원래의 문을 강화하기 위해, 다음도 괜찮습니다 -in-c – Messa

+1

3 성급 프로그래머가 되신 것을 축하드립니다. – chris

+1

우리가 실제로'b '를 초기화하는 것을 볼 때까지는 합법적이지만 꽤 좋지 않고 잠재적으로 정의되지 않은 동작입니다. – Jeff

답변

7

X[Y]는 긴 X 중 하나 Y 포인터 형이고, 다른 하나는 일체형를 갖는 한 동일 *(X + Y)이다. 따라서 b[-1]*(b - 1)과 동일합니다. 이는 잘 형성된 프로그램에서 평가되거나 평가되지 않을 수있는 표현입니다. –은 모두 b의 초기 값에 따라 다릅니다! 예를 들어, 다음은 완벽하게 괜찮 : 일반적으로

int q[24]; 
int * b = q + 13; 

b[-1] = 9; 
assert(q[12] == 9); 

, 그것은 프로그래머와 같은 책임은 당신이 그들과 함께 작업을 수행 할 때 포인터가 허용 값을 보장하는 것입니다. 잘못하면 프로그램에 정의되지 않은 동작이 발생합니다. 예를 들어 :

std::cout << 2["Good morning"] << 4["Stack"] << 8["Overflow\n"]; 
+0

정의되지 않은 동작이 발생하는 예제를 작성해야한다고 생각합니다. –

+0

@RSahu : 좋습니다. –

+0

"Ok \ n"인쇄를위한 엄지 손가락 업. 내가 할 수 있다는 것을 몰랐다! – Deamonpog