2012-11-29 5 views
0

이 가능한 중복 :효과는

struct Test 
{ 
    int a[128]; 
    char b[768]; 
}; 

int main() 
{ 
    Test test; 
    for(int i = 0; i < 200; ++i) 
     test.a[i] = 1; 
    return 0; 
} 

I :
Array overflow (why does this work?)

는이 같은 무언가를 일부 C++ 코드를 발견 그것이 잘못되었다는 것을 깨달으십시오. 그러나 나는 그 효과가 어떻게 될 것인지 알고 싶다. GCC 4.3.4에서 Test :: b 배열은 변경되지 않았습니다. 그게 보장 되니? 여기서 무슨 일이 일어나고있는거야?

읽기와 동일한 효과입니까? 예 :

int main() 
{ 
    Test test; 
    for(int i = 0; i < 200; ++i) 
     int z = test.a[i]; 
    return 0; 
} 
+0

이에 대한 수많은 질문 ... 예. http://stackoverflow.com/questions/10051782/array-overflow-why-does-this-work – djechlin

+0

정확한 중복으로 투표하려면 투표하십시오. 이것이 정말로 다른 질문과 다른 것으로 간주된다면 유일한 다른 의견은 너무 현지화되어 있습니다. – djechlin

답변

3

그것은 정의되지 않은 동작, 그리고 아무것도가 발생할 수 있습니다.

더 많은 단지 컴파일러보다 고려해야 할 변수가있다 - 버전, OS, 하드웨어, 날씨, 그것이 무슨 요일, 등등

표준이 정의되지 않은 동작이 그렇게 아무것도 의미 할 수 있다고 말한다 당신은 실제로 같은 컴파일러를 사용하지 않아도 어떤 기대도 가질 수 없습니다.

예를 들어 test.a 바로 뒤에 다른 변수가있는 경우 액세스 위반이 발생할 수 있습니다. 또는 단순히 변수를 덮어 쓸 수 있습니다. 아무거나 간다.

기본적으로,이 경우에 정의되지 않은 쓰기 부분은 아니지만 i>=128

test.a[i] 

에 대한 호출. 그것은 단지 허용되지 않습니다.

+0

_defined_가 표준에서 정의되지 않은 동작입니까? 지금은 브라우징 중이지만 아무것도 찾지 못했습니다. – PaulH

+0

@PaulH 예입니다. –

1

undefined behaviour 배열의 바깥 쪽 경계면에 쓸 내용을 예측할 수 없습니다.

0

정의되지 않은 동작입니다. 절대적으로 보증은 없으며, 문자 그대로 무엇이든 일어날 수 있습니다. 변덕스러운 발언은 할머니에게 전자 메일을 보낼 수 있다는 것입니다. 연습 b의 시작으로 인해 정렬을 위해 패딩에 a의 종료 후 즉시 따르지 않을 수 있지만 아마의 Test 객체에 더 쓰는 것입니다에서

http://en.wikipedia.org/wiki/Undefined_behavior

.

C++, C++ 표준에 의해 정의 된 추상적 인 언어로

http://en.wikipedia.org/wiki/Data_structure_alignment

0

, 아무것도 전혀 발생할 수 있습니다. G ++ 4.3.4에서

,이 컴파일러에 의해 정의 된 콘크리트 언어, 일어날 특정 아무것도test.b의 첫 번째 288 개 요소를 덮어 쓸 것입니다.

0

"정의되지 않은 동작"외에도 실제로 수행되는 작업은 덮어 쓰는 부분이 실제로 사용되는지 여부에 따라 달라집니다.해당 메모리 조각을 사용하지 않으면 오류 또는 충돌이 발생할 수 있습니다 (문제를 모니터링하기 위해 무엇이든지 실행중인 경우에 따라 다름). 그러나 일부 데이터가 있고 충돌이 발생하지 않으면 덮어 쓰기 된 부분에 의존하는 다른 코드가 실행되지 않는 소프트웨어에서 캐스케이드 효과가 발생할 수 있습니다. 이 문제를 너무 어렵게 추적하는 이유는 계단식 오류가 발생했을 때 눈에 보이는 증상과 달리 근본 원인을 찾기가 어렵 기 때문입니다 ("이 변수에 결코 값을 할당하지 않으면 왜이 변수에 값 x가 생기는 것입니까? ")

관련 문제