2017-12-10 10 views
-2

C 배열에 꼬리 부분에 여분의 바이트가있을 수 있습니다.C 배열에 꼬리 부분에 여분의 바이트가있는 이유는 무엇입니까?

내 코드

int a = 5; 
int test[] = {1,2,3,4}; 
int b = 5; 

test[-1] = 11; 
test[4] = 11; 

cout << b << endl; // 11 
cout << a << endl; // 5 

당신은 b의 값이 test[-1]의 값을 변경을 통해 변경되는 실행 결과 there

을 볼 수 있습니다. 그러나 test[4]의 값을 변경하면 a의 값은 변경되지 않습니다.

나는, 자신의 주소를 확인하기 위해 GDB를 사용

g에서

++ 6.4.0가, test[4]a 빼기 주소의 주소가 3.8.1 ++ 그 소리에서 8 바이트
a 빼기 주소의 주소인지 발견 test[4]은 4 바이트입니다.

그래서 왜 배열에 꼬리 부분에 바이트가 있는지 궁금합니다.

감사합니다. @Peter A.Schneider가 질문을 설명합니다. 분명히 UB이지만 실험 코드 일뿐입니다. 실용적인 코드에 대한 논의가 아닙니다.

일반적으로 런타임 스택의 변수는 서로 가깝습니다. b은 test에 가깝지만 'a'가 'test + 3'에 근접하지 않은 이유는 무엇입니까? 그것이 바로 문제의 핵심입니다.

+0

'테스트 [-1] 11 =;'- -1 인덱스 –

+4

을 위해 당신은 _undefined 호출 할 수 없습니다.? behavior_ 및 특정 하나를 기대하십시오 – user0042

+2

코드에 UB가 있습니다 –

답변

5
test[-1] = 11; 
test[4] = 11; 

이것은 정의되지 않은 동작입니다 (아무런 의미가 없습니다). 귀하의 경우에는 b 값이 할당 된 메모리에서 인접하기 때문에 값을 변경했습니다. 그러나 당신은 그것에 의지해서는 안됩니다. 이것은 프로그램을 폭파하거나 대부분의 경우 잘못된 코드 동작을 유발할 수 있기 때문입니다. `가 정의되지 않은 동작에 바운드에서 배열 인덱스를 액세스하기 때문에 당신이

UB는 "

+1

왜 이것이 정의되지 않은 동작인지 (규칙을 벗어난 배열에 액세스하는 것은 UB 임) 규칙을 언급해야합니다. – LoPiTaL

+0

@LoPiTaL .: Yes 편집 됨. – coderredoc